c++ - 如何利用尾部填充?
问题描述
看看这个简单的代码:
struct Foo {
short a;
char b;
};
struct Bar: Foo {
char c;
};
在当前的编译器中,sizeof(Bar)
是 6。这是正常的,就像sizeof(Foo)
4 一样,
Bar::c
加上它,我们得到 5 个字节,因为Bar
' 的对齐方式是 2,所以它的大小为 6。
但是,如果Bar
不是标准布局,那么编译器将被允许放入c
的尾部填充中Foo
,因此sizeof(Bar)
将是 4。
实现此目的最惯用的方法是什么(侵入性较小的修改,最清晰的方法)?
解决方案
使用当前的编译器,
sizeof(Bar)
是 6。
这实际上是一个错误的假设,即使您可以定义“当前编译器”是什么。“标准布局”也是一个毫无意义的流行语。
如果我正确理解您要达到的目标,#pragma pack
那就是答案。您可以逐个类地指示编译器使用什么字节打包。
通常对于网络传输,您可能希望使用 1 的包装,而对于其他任何事情(内存操作、存储等),只需让编译器为您完成。它通常会将您的字段填充到字边界上,以获得最大的访问性能(不要与缓存性能混淆)。
推荐阅读
- python - 如何将python嵌套的dict键转换为xpath之类的字符串?
- postgresql - 使用 Testcontainers 时如何设置 Postgresql 的端口?
- excel - 复制粘贴整个表格
- vscode-debugger - VSC将\添加到文件路径,导致找不到文件错误
- javascript - Require.context 正则表达式问题
- javascript - React 页面每秒无限刷新页面
- javascript - mongoose中未定义递归嵌套模型的最优解
- selenium-webdriver - 如何在屏幕上打开和查看运行 PHPUnit + Selenium (webdriver) 测试的浏览器?
- node.js - 如何从 node.js 控制台中运行 javascript?
- php - PHP 启动:无法加载动态库 mbstring,即使 mbstring 存在于 ext 文件夹中