起因
网友问一个C++的程序不稳定。俺举了例子。
例子
俺们有个程序 之前是 vc6 写的很稳定。但是 升级到IDE VS2010 之后就 有时意外退出。源码还是那个源码 ,没有任何改变。俺就查。发现是编译的问题。 那个c++的代码 确实有点的问题。
在处理一个 结构体时会越界写字节。但是因为 vc 6 编译是 变量分配 和 内存管理时 ,对齐比较宽,所有这个越界 没啥问题。反正不会污染 下一个变量。VS2010 编译时对齐 好像是4字节 还是8字节 俺忘了 ,但是比较紧凑。这样 越界就有时 会污染下一个变量。解决问题 有两种 俺试了都可以:
1、VS2010 编译时结构体的 内存对齐 改成8还是16 俺忘了 反正改大。
2、改掉代码中的bug
俺们先是 用第一种方式 发布了一个版本 应急。
然后 抽时间 把代码里的bug都改掉。 然后 改回原来的内存对齐。再发布了一个版本。
设置
在Visual Studio 中,结构体成员的对齐方式可以通过项目属性进行设置。
在Visual Studio 中,可以通过项目属性来设置结构体成员的对齐方式。具体步骤如下:
- 打开项目属性窗口,选择“配置属性”中的“C/C++”选项。
- 在“代码生成”部分找到“结构体成员对齐”选项,可以选择1字节、2字节、4字节、8字节或默认值。
- 根据需要选择合适的对齐方式,例如选择“1字节”对齐可以减少结构体的内存占用,但可能会影响访问速度1。
此外,了解结构体成员对齐的基本原理和规则也很重要。结构体成员的对齐是为了提高CPU访问内存的效率,使得数据能够按照一定规则整齐地排列在内存中,便于CPU快速读取和处理。默认情况下,结构体成员会按照4字节或8字节对齐(具体取决于编译环境的配置)
/Zp(结构成员对齐)
- 项目
- 2024/08/03
- 9 个参与者
反馈
本文内容
控制如何将结构成员打包到内存中,并在模块中为所有结构指定同一包装。
语法
]$
注解
/ZpN
选项指示编译器存储每个结构成员的位置。 编译器在边界上的第一个后存储成员,这是以下项中较小的项:成员类型大小或 N 字节边界。
下表中描述了可用的包装值:
展开表
/Zp 参数 | 效果 |
---|---|
1 | 在 1 字节边界上打包结构。 与 /Zp 相同。 |
2 | 在 2 字节边界上打包结构。 |
4 | 在 4 字节边界上打包结构。 |
8 | 在 8 字节边界上打包结构(x86、ARM 和 ARM64 的默认设置)。 |
16 | 在 16 字节边界上打包结构(x64 和 ARM64EC 的默认设置)。 |
如果没有特定的对齐要求,请不要使用此选项。
警告
Windows SDK 中的 C/C++ 标头假定使用平台的默认对齐方式。 当包含 Windows SDK 标头时,请不要通过在命令行上使用 /Zp
或使用 #pragma pack
更改设置的默认值。 否则,应用程序可能会导致运行时出现内存损坏。
还可以使用 pack pragma 来控制结构打包。 有关对齐的详细信息,请参阅:
在 Visual Studio 开发环境中设置此编译器选项
-
打开项目的“属性页” 对话框。 有关详细信息,请参阅在 Visual Studio 中设置 C++ 编译器和生成属性。
-
选择“配置属性”>“C/C++”>“代码生成”属性页面。
-
修改“结构成员对齐”属性。