Нет.
IDA "строит" структуру на основе информации, которая есть в конкретной функции (т.е. функции, внутри которой ты создаешь структуру).
Например, есть 2 метода одного и того же класса (для упрощения - представим, что все поля этого класса имеют тип int).
В первом есть доступ только к полям +0 и +4, во втором - только к полям +8 и + 12
Если создавать структуру из первого метода, получим структуру
struct A { // sizeof(A) = 0x8
int _f0;
int _f4;
};
А если создавать из второй -
struct A { // sizeof(A) = 0x10
char _gap0[8]; // 'gap' - 'пропасть', неизвестные данные
int _f8;
int _fC;
};
Обычно доступ к большинству полей производится именно в конструкторе, поэтому логичнее создавать структуру из функции-конструктора.
Если речь идёт только о размере структуры - то тут есть 2 варианта.
Первый - если память под обьект структуры (класса) выделяется динамически. В таком случае, в коде мы точно увидим размер выделяемой памяти.
В C++ такое создание обьекта выглядит так:
MyObject *object = new MyObject; // C++ вызывает operator new (оператор выделения памяти) и далее конструирует обьект (вызывает конструктор)
Вот примерно так в коде R* выглядело создание транспортного средства:
CAutomobile *automobile = new CAutomobile; // C++ вызывает перегруженный оператор CVehicle::operator new (который ищет и возвращает пустой слот в пуле CVehicle), далее вызывает CAutomobile::CAutomobile (конструктор))
В оператор выделения памяти (operator new) передается параметр - размер выделяемой памяти (не явно), а после этого вызывается конструктор (тоже не явно).
На уровне чуточку "ниже" этот код выглядит так (см. любой вызов CAutomobile::CAutomobile в базе):
// CAutomobile *automobile = new CAutomobile;
CAutomobile *automobile;
CVehicle *data = CVehicle::operator new(0x988); // выделяем память под обьект
if ( data ) // если удачно выделили
automobile = CAutomobile::CAutomobile(data, modelIndex, createdBy, 1); // конструируем обьект
else
automobile = 0; // иначе получаем пустой указатель
Тут мы можем увидеть, что размер структуры CAutomobile - 0x988 байт.
Второй вариант - это когда память под обьект выделяется на стеке или в глобальном пространстве.
Тут я бы тоже выделил 3 случая:
1) Обьект выделен на стеке
2) Обьект находится в глобальном пространстве (глобальный обьект или статическая переменная класса)
3) Массив обьектов в глобальном пространстве (глобальный обьект или статическая переменная класса).
По всему этому постараюсь завтра расписать.