sizeof(struct)C++中奇怪的输出
sizeof(struct) weird output in C++
有人能解释一下这段代码的输出吗?
#include <iostream>
using namespace std;
struct Yo{
char sex;
int a;
};
int main() {
Yo c;
cout<<sizeof(c.sex);
cout<<endl<<sizeof(c.a);
cout<<endl<<sizeof(c);
return 0;
}
输出:1 4 8
8号楼的大小是多少?
这是内存对齐。
struct Yo{
char sex; // Takes up 1 byte + 3 for padding
int a; // Takes up 4 bytes
};
sex
和a
之间的三个字节将不会被使用,因为编译器会将它们对齐以获得更好的性能。因此,sex
最终使用1字节的空间,并且成员变量之后的三个字节被用作填充,以确保int a
具有4的地址倍数(它是4字节对齐的)。
因为结构填充(也称为内存对齐)。对齐必须是二次方(C11在6.2.8p4中明确说明了这一点,如@KeithThompson所述),因为您的结构的总大小是5,所以4的最近倍数是8,所以它给出8,这也是因为对齐必须是2次方。
您可以使用#pragma pack
来获得确切的大小。
#pragma pack(push, 1) /* set alignment to 1 byte boundary */
struct A {
char s;
int a;
};
#pragma pack(pop) // restore to default
警告:#pragma pack
不在标准C中,也不存在结构需要4字节对齐的假设。正如@KeithThompson所言。
"类型的大小必须是其对齐方式的倍数,但大小不必是2的幂。例如,假设4字节int,像struct { int a, b; char d; }
这样的结构可能具有4的排列和12的大小。大小是对齐的最近倍数,而不是2的最近幂。"-@KeithThompson
打包有助于减少内存,当结构中充满整数、固定字符长度等时使用它。我不知道与指针一起使用是否好,但我认为在使用指针(例如结构中的void *
)时它没有用处。
点击此处阅读更多
相关文章:
- 递归函数计算序列中的平方和(并输出过程)
- 如何使用 < 和 > 命令获取 c++ 中的输入和输出?
- 请解释"函数1(p1,p2,p3);"的输出
- C++:将控制台输出存储在宏中更好吗
- 创建一个函数以在输入为负数或零时输出字符串.第一次执行用户定义的函数
- 如何在OMNET++中指定与命令行参数组合的输出文件名
- 为什么我的代码在输出中增加了93天
- 如何从void函数输出字符串
- 输入到文件并输出到另一个文件,并将流文件传递给函数
- AES加密到解密未正确输出
- 如何将c++程序的一些输出传递给shell,以便在shell中使用
- 使用C++程序合并排序没有得到正确的输出
- 为什么我不能在不创建字符串变量的情况下使用函数的字符串输出
- C++格式化输出问题
- 将值从二维数组输出到文本文件
- 集合上的输出迭代器:assign和increment迭代器
- 在while循环中输入带有std::cin的字符串后,控制台会输出大量胡言乱语
- 为什么rk4.do_step不输出C++中的初始条件
- 输出没有重复元素的动态数组(收缩数组)C++
- 如何根据单词在文本中出现的概率输出单词