Есть ли способ получить размеры всех переменных-членов определенного класса без фактического запуска кода? (т.е. нет операций sizeof (), offset_of ())
Есть ли у objdump или otool некоторые опции для извлечения этой информации из промежуточных объектных файлов (или даже из конечного файла ELF)?
РЕДАКТИРОВАТЬ:
«Что я пытаюсь сделать?»
Между двумя сборками нашего программного обеспечения я заметил, что конкретный экземпляр класса увеличился в размерах. Этот класс очень большой со многими, многими переменными-членами. Рассматриваемый класс не изменился между двумя сборками, но его переменные-члены изменились. Я пытаюсь найти виновника (и это будет своего рода поиск в глубину, так как мне придется продолжать копать все глубже и глубже в каждую переменную-член, пока я не найду ее) и мне нужен масштабируемый метод, чтобы сделать это без обращения к printfs () и diffing.
Вы можете создать инструмент на основе лязг скомпилировать ваш код и вывести макет записи вашего класса во время компиляции. Тогда вы сможете сравнить их.
(Возможно, есть аналогичный метод и для других компиляторов.)
Вы можете распечатать константы времени компиляции, например, 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;