C ++类的大小是40个字节,而不是36个字节

问题描述 投票:-1回答:2

我的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
c++ struct padding sizeof
2个回答
3
投票

有人可以解释吗?

sizeof总是返回正确的大小。因此,我们可以推断出您对尺寸的期望是错误的。

您没有解释您为什么认为自己做了什么,但是最有可能导致错误的原因是没有考虑内存对齐。

我认为,字符串是32字节

它可以在某些系统上。并非在所有系统上都是如此。

并且int是4个字节。

它可以在某些系统上。并非在所有系统上都是如此。

所以sizeof(SizeTest)应该是36个字节

没有类的大小不是“应该”等于其成员大小的总和。


1
投票
std::string name;
int i;

std::string包含一个指向数组的指针,以及2个指针或size_t用于大小和容量。在64位平台上,它们是64位类型,因此std::string必须对齐8个字节,因此您的类也是8字节对齐的。在您的实现中,std::string是32字节类型(并非适用于所有实现),而int是4字节类型,这使得总大小为36字节

结果必须添加4个字节的填充以将大小四舍五入为8的下一个倍数,以便在将数组放入数组时,该类的所有实例都正确对齐。结果是一个40字节的类

另请参阅Why isn't sizeof for a struct equal to the sum of sizeof of each member?

© www.soinside.com 2019 - 2024. All rights reserved.