int b;
};
int main()
{
x x1;
std::cout <<sizeof(int) << std::endl;
std::cout <<sizeof(std::string) << std::endl;
std::cout << sizeof(x) << std::endl;
}
вывел: 4, 24, 32
скажите, получается в самой структуре что то есть еще на 4 байта?
padding, например не уверен, почему, правда
без паддинга для ситуации x arr[2]; у arr[1].k будет alignment 4, хотя нужен 8
8 это откуда? требования amd64?
предполагаю, что этого требует std::string, который внутри себя хранит указатель на 8 байт с alignof() == 8
alignof() должен прояснить ситуацию
по крайней мере в static_assert(alignof(std::string) == 8); успешен на трёх компиляторах под x86-64
А что тебя смущает?
Хотел узнать откуда 4 байта и на что они тратятся
Так -то клади в структуру сначала маленькие члены данных, потом большие. Будет меньше выравнинвание
Под 64 бита компилишь?
компилятор выставляет более эффективно члены структуры в памяти, чтобы обращаться к ним было удобно и быстрее
Там скорее всего банальное выравнивание на 64битный указатель
это не вопрос эффективности, а вопрос корректности. объектная модель зиждется на корректном выравнивании всех объектов
??? Если бы это было также эффективно, придумали бы уж как не сломать всё нахрен сдвинув на 1 байт инт
вообще, ровно наоборот
Ну или нооборот
Обсуждают сегодня