Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/158.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 结构大小即使在添加新成员后也保持不变_C++_String_Struct - Fatal编程技术网

C++ 结构大小即使在添加新成员后也保持不变

C++ 结构大小即使在添加新成员后也保持不变,c++,string,struct,C++,String,Struct,什么时候是简单的执行 cout << sizeof(string); 我正在执行 cout << sizeof(myType); cout << sizeof(myType); 我正在执行 cout << sizeof(myType); cout << sizeof(myType); cout可能正在发生。例如,sizeof(int)可以是4个字节,为了数据对齐,编译器可以在a之后添加4个字节。布局可以如下所示: typede

什么时候是简单的执行

cout << sizeof(string);
我正在执行

cout << sizeof(myType);
cout << sizeof(myType);
我正在执行

cout << sizeof(myType);
cout << sizeof(myType);
cout可能正在发生。例如,
sizeof(int)
可以是4个字节,为了数据对齐,编译器可以在
a
之后添加4个字节。布局可以如下所示:

typedef struct {
    int a;      // 4 bytes
                // 4 bytes for padding
    string str; // 8 bytes
} myType;

typedef struct {
    int a;      // 4 bytes
    int b;      // 4 bytes
    string str; // 8 bytes
} myType;
也许正在发生。例如,
sizeof(int)
可以是4个字节,为了数据对齐,编译器可以在
a
之后添加4个字节。布局可以如下所示:

typedef struct {
    int a;      // 4 bytes
                // 4 bytes for padding
    string str; // 8 bytes
} myType;

typedef struct {
    int a;      // 4 bytes
    int b;      // 4 bytes
    string str; // 8 bytes
} myType;

看起来像8字节对齐


因此,如果您有任何少于8字节的数据类型,它仍将使用8字节

我假设指针是8字节,而int每个只有4字节


您可以使用下面列出的代码强制1字节对齐。第一种情况下,您应该得到不同的大小。

看起来像8字节对齐


因此,如果您有任何少于8字节的数据类型,它仍将使用8字节

我假设指针是8字节,而int每个只有4字节

您可以使用下面列出的代码强制1字节对齐。然后,对于第一种情况,您应该得到不同的大小。

在C/C++中,结构被“打包”在字节块中。您可以指定应打包结构的大小。 这里有一个参考:

在C/C++中,结构被“打包”在字节块中。您可以指定应打包结构的大小。
这里有一个参考:

它被称为结构打包,以实现最佳内存对齐


查看以了解方法和原因。在C和C++中都是这样做的。

< P>它称为结构填充以实现最佳内存对齐。

查看以了解方法和原因。在C和C++中都是这样做的。

IDENE.COM()中的编译器配置产生12作为Syrt的大小。请不要做TyPufFrase{{}}类型名称;这是C。虽然C++中允许向后兼容,但它不是习惯用法。这真让人讨厌。使用结构类型名{…};谢谢@Rob K,我会记住这一点,我不会在ideone.com()的编译器配置中重复这一点。结构的大小为12。请不要使用typedef struct{…}typename;这是C。虽然C++中允许向后兼容,但它不是习惯用法。这真让人讨厌。使用结构类型名{…};谢谢@Rob K,我会记住这一点,我不会再重复这一点了only@Venkatesh这就是我所期望的。谢谢你的回答@AlexDsizeof(int)是4字节only@Venkatesh这正是我所期望的。谢谢你的回答@AlexDIn C data in structs以与C++相同的方式对齐是的,完全正确,事实上C++是基于C的…为什么1?不回答这个问题。链接中的例子解释了Sigeof结果的原因。@ CABB:我们不是在这里留下链接,而是回答问题。在C结构中的数据与C++中的相同,是完全正确的,C++是C的…为什么-1?没有回答这个问题。链接中的示例确实解释了结果大小的原因。@cabbi:我们不是来留下链接的,而是来回答问题的。“因此,如果有任何数据类型少于8字节,它仍将使用8字节”,这不完全正确<代码>标准::字符串
在本例中与8字节对齐,因此没有任何数据将使用8字节,这取决于该数据后面的内容。是的,在本例中。我假设std::string在这里是8个字节,因为它是一个(64位)指针,也是8个字节对齐的?!“因此,如果您有任何少于8字节的数据类型,它仍将使用8字节”,这并不完全正确<代码>标准::字符串在本例中与8字节对齐,因此没有任何数据将使用8字节,这取决于该数据后面的内容。是的,在本例中。我假设std::string在这里是8个字节,因为它是一个(64位)指针,也是8个字节对齐的?!