- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
#include <iostream>
using namespace std;
struct Foo {char a; int b; char c;};
struct Bar {char a; char b; int c;};
int main() {
cout << sizeof(Foo) << endl;
cout << sizeof(Bar) << endl;
}
Нашли или выдавили из себя код, который нельзя назвать нормальным, на который без улыбки не взглянешь? Не торопитесь его удалять или рефакторить, — запостите его на говнокод.ру, посмеёмся вместе!
0
#include <iostream>
using namespace std;
struct Foo {char a; int b; char c;};
struct Bar {char a; char b; int c;};
int main() {
cout << sizeof(Foo) << endl;
cout << sizeof(Bar) << endl;
}
https://ideone.com/XKWey3
Какой бароп )))
во всех .h файлах, где эти структуры декларированы
Во всех модулях, из которых собирается экзешник, порядок полей в структуре должен быть одинаковым, иначе данные распидорасит.
У тебя есть модуль kurochka.c. В нём ты вызываешь функцию pitushnya из другого модуля, в которую передаёшь структуру.
Чтобы это работало, в модулях kurochka.c и pethu.c порядок полей в структуре не должен зависеть от параметров оптимизации.
или ты должен extern "C"
нет?
если все файлы собирает один компилятор, то он может применить какие угодно оптитмизации, но только одинаковые для всех единиц трансляции
А вот а если ты хочешь сделать .so/.dll, то вероятно оптимизировать нельзя:
лейаут структуры же тогда будет частью ABI, но вроде бы ABI у С++ не гарантируется, только у си
Вот я клиент, у меня есть .h файл, как моему компилятору понять, что ты там напаерестовлял?
а, там вроде contant pool: то есть там серху написано "поле ptiz -- номер 8", а потом в коде getstatic 8
сначала у тебя написано
method "getPetuz()" -- #42
А потом invokevirtual #42
Ну тогда компилятор не виноват: если там нету такой главы, то он не имеет права оптимизировать?
Но смешивать дебаг с релизом, как петух ниже предлагает, часто тоже нельзя. В студии например просто не слинкуется.
И вроде сам стандарт его благославляет, в отличие от перестановки.
а почему не благославить перестановку?
Хотя какую-нибудь #pragma reorder можно сделать по аналогии с #pragma pack.
А на самом деле всем похуй. Опытный сишник и сам в состоянии расположить поля правильно, чтобы не было лишних паддингов.
в общем если я пишу .h файл, то я должен включать мозг, и распологать их в правильном порядке?
а если у меня структура в которой структура в которой структура в которой структура? Как это посчитать?
хочу у решарпера кнопку "sort by size"
Что-то сложно получается. Тогда смещения всех остальных переменных поедут, нельзя будет делать компилтаймовую оптимизацию, чтобы класть структуру в регистр, ещё какую-нибудь оптимизацию придётся отменить...
типа поле не 22 а 22 + fixup
Откуда компилятору с -O0 знать, что ты хочешь экономить память?
В С++ можешь, да?
и про миллион одинаковых деклараций, которые обязаны совпадать
извини
ты можешь в другом файле задекларировать другую Foo
удоли мой предыдущий коммент, стыдно
становилось как
https://gcc.gnu.org/onlinedocs/gcc/Common-Type-Attributes.html#Common-Type-Attributes
If the member is not empty, any tail padding in it may be also reused to store other data members.