- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 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
Какой бароп )))
Во всех модулях, из которых собирается экзешник, порядок полей в структуре должен быть одинаковым, иначе данные распидорасит.
У тебя есть модуль kurochka.c. В нём ты вызываешь функцию pitushnya из другого модуля, в которую передаёшь структуру.
Чтобы это работало, в модулях kurochka.c и pethu.c порядок полей в структуре не должен зависеть от параметров оптимизации.
Но смешивать дебаг с релизом, как петух ниже предлагает, часто тоже нельзя. В студии например просто не слинкуется.
И вроде сам стандарт его благославляет, в отличие от перестановки.
Хотя какую-нибудь #pragma reorder можно сделать по аналогии с #pragma pack.
А на самом деле всем похуй. Опытный сишник и сам в состоянии расположить поля правильно, чтобы не было лишних паддингов.
Что-то сложно получается. Тогда смещения всех остальных переменных поедут, нельзя будет делать компилтаймовую оптимизацию, чтобы класть структуру в регистр, ещё какую-нибудь оптимизацию придётся отменить...
Откуда компилятору с -O0 знать, что ты хочешь экономить память?
становилось как
https://gcc.gnu.org/onlinedocs/gcc/Common-Type-Attributes.html#Common-Type-Attributes