Получение размеров переменных членов класса (без запуска кода)

Есть ли способ получить размеры всех переменных-членов определенного класса без фактического запуска кода? (т.е. нет операций sizeof (), offset_of ())

Есть ли у objdump или otool некоторые опции для извлечения этой информации из промежуточных объектных файлов (или даже из конечного файла ELF)?

РЕДАКТИРОВАТЬ:

«Что я пытаюсь сделать?»

Между двумя сборками нашего программного обеспечения я заметил, что конкретный экземпляр класса увеличился в размерах. Этот класс очень большой со многими, многими переменными-членами. Рассматриваемый класс не изменился между двумя сборками, но его переменные-члены изменились. Я пытаюсь найти виновника (и это будет своего рода поиск в глубину, так как мне придется продолжать копать все глубже и глубже в каждую переменную-член, пока я не найду ее) и мне нужен масштабируемый метод, чтобы сделать это без обращения к printfs () и diffing.

1

Решение

Вы можете создать инструмент на основе лязг скомпилировать ваш код и вывести макет записи вашего класса во время компиляции. Тогда вы сможете сравнить их.

(Возможно, есть аналогичный метод и для других компиляторов.)

1

Другие решения

Вы можете распечатать константы времени компиляции, например, sizeof без запуска кода. Пример:

class X
{
int x;
int y;
int z;
};template <int i>
class foo;

foo<sizeof(X)> x;

Сообщение об ошибке ясно показывает значение sizeof выражение:

test.cpp:12:16: error: aggregate ‘foo<12> x’ has incomplete type and cannot be defined
foo<sizeof(X)> x;

Работает на offsetof также. Вы также можете запросить больше смещений одновременно:

#include <cstddef>
foo<offsetof(X,X::x)> offset_x;
foo<offsetof(X,X::y)> offset_y;
foo<offsetof(X,X::z)> offset_z;

Результат:

test.cpp:15:23: error: aggregate ‘foo<0> offset_x’ has incomplete type and cannot be defined
foo<offsetof(X,X::x)> offset_x;
^
test.cpp:16:23: error: aggregate ‘foo<4> offset_y’ has incomplete type and cannot be defined
foo<offsetof(X,X::y)> offset_y;
^
test.cpp:17:23: error: aggregate ‘foo<8> offset_z’ has incomplete type and cannot be defined
foo<offsetof(X,X::z)> offset_z;
2

По вопросам рекламы [email protected]