размер класса C ++ составляет 40 байт вместо 36 - PullRequest
0 голосов
/ 22 марта 2020

Мой класс C ++ содержит данные-члены типа string и int. Я думал, что его размер составляет 36 байтов, но вывод говорит 40 байтов. Может кто-нибудь объяснить?

#include <iostream>

using namespace std;

class SizeTest {

private:
    std::string name;
    int i;

};

int main(int argc, char** argv) {

    cout<<"sizeof(SizeTest) is : " << sizeof(SizeTest)<<endl;
}

Вывод:

sizeof(SizeTest) is : 40

Ответы [ 2 ]

3 голосов
/ 22 марта 2020

Может кто-нибудь объяснить?

sizeof всегда возвращает правильный размер. Таким образом, мы можем сделать вывод, что ваше ожидание размера было неверным.

Вы не объяснили, почему думали, что сделали, но, скорее всего, причиной ошибки является неспособность принять во внимание выравнивание памяти.

Я думал, что строка 32 байта

Это может быть в некоторых системах. Это не относится ко всем системам.

, а int равно 4 байта.

Это может быть в некоторых системах. Это не относится ко всем системам.

Таким образом, sizeof (SizeTest) должен составлять 36 байтов

Нет. Размер класса «не должен» быть суммой размера его членов.

1 голос
/ 22 марта 2020
std::string name;
int i;

std::string обычно содержит указатель на массив и 2 указателя или size_t s для размера и емкости. На 64-битной платформе это 64-битные типы, поэтому std::string должен быть выровнен до 8 байтов, следовательно, ваш класс также выровнен по 8 байтов . В вашей реализации std::string является 32-байтовым типом (который не применяется ко всем реализациям), а int является 4-байтовым типом, который дает общий размер 36 байтов

В результате 4 байта заполнения должен быть добавлен для округления размера до следующего кратного 8, чтобы при помещении в массив все экземпляры класса были правильно выровнены. В результате получается 40-байтовый класс

См. Также Почему sizeof для структуры не равен сумме sizeof каждого члена?

...