数据结构填充
什么是 C++ 中的数据结构填充以及如何检查填充字节的字节数?
class a { public: int x; int y; int z; };
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
什么是 C++ 中的数据结构填充以及如何检查填充字节的字节数?
class a { public: int x; int y; int z; };
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
接受
或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
发布评论
评论(4)
哈哈,只需创建 2 个相同的结构,将其中之一打包
例如
sizeof(foo) - sizeof(bar)
会给你填充量。或者你也可以像 Duck 建议的那样手动计算。
Lol just create 2 identical structs, make one of them packed
e.g.
sizeof(foo) - sizeof(bar)
will give you the amount of padding. Or you could also calculate manually like Duck suggested.
处理器要求某些类型的数据具有特定的对齐方式。例如,处理器可能要求
int
位于 4 字节边界上。因此,例如,int
可以从内存位置0x4000
开始,但不能从0x4001
开始。因此,如果您定义了一个类:编译器必须在
c
和i
之间插入填充,以便i
可以在 4 字节边界上开始。Processors require that certain types of data have particular alignments. For example, a processor might require that an
int
be on a 4-byte boundary. So, for example, anint
could start at memory location0x4000
but it could not start at0x4001
. So if you defined a class:the compiler would have to insert padding between
c
andi
so thati
could start on a 4-byte boundary.出于性能原因进行填充 - 请参阅这篇文章数据结构对齐更多信息。
要查看编译器是否填充您的数据结构,您可以编写一个简单的程序:
我添加了公共声明以避免编译器错误 - 它不会影响大小或填充。
编辑:在我的 MacBook Air 上运行它会给出以下输出:
12
0x7fff5fbff650
0x7fff5fbff654
0x7fff5fbff658
这表明在我的机器上总大小是12字节,每个成员相隔4字节。每个 int 为 4 个字节(可以通过 sizeof(int) 确认)。没有填充。
与班上的不同成员一起尝试此操作,例如:
padding is done for performance reasons - see this article Data Structure Alignment for more info.
To see whether the compiler pads your data structure you could write a simple program:
I added the public declaration to avoid compiler errors - It will not affect the size or padding.
Edit: Running this on my macbook air gives the following output:
12
0x7fff5fbff650
0x7fff5fbff654
0x7fff5fbff658
This shows that on my machine the total size is 12 bytes, and each member is 4 bytes apart. The ints are 4 bytes each (which can be confirmed with sizeof(int)). There is no padding.
Try this with different members in your class, for example: