回答一个网友程序错误的问题

起因

网友问一个C++的程序不稳定。俺举了例子。

例子

俺们有个程序  之前是 vc6 写的很稳定。但是 升级到IDE VS2010  之后就 有时意外退出。源码还是那个源码 ,没有任何改变。俺就查。发现是编译的问题。 那个c++的代码 确实有点的问题。
在处理一个 结构体时会越界写字节。但是因为 vc 6 编译是 变量分配 和 内存管理时 ,对齐比较宽,所有这个越界 没啥问题。反正不会污染 下一个变量。VS2010 编译时对齐 好像是4字节 还是8字节 俺忘了 ,但是比较紧凑。这样 越界就有时 会污染下一个变量。解决问题 有两种 俺试了都可以:

1、VS2010 编译时结构体的 内存对齐 改成8还是16 俺忘了 反正改大。

2、改掉代码中的bug

俺们先是 用第一种方式 发布了一个版本 应急。

然后 抽时间 把代码里的bug都改掉。 然后 改回原来的内存对齐。再发布了一个版本。

设置

Visual Studio 中,结构体成员的对齐方式可以通过项目属性进行设置。

在Visual Studio 中,可以通过项目属性来设置结构体成员的对齐方式。具体步骤如下:

  1. 打开项目属性窗口,选择“配置属性”中的“C/C++”选项。
  2. 在“代码生成”部分找到“结构体成员对齐”选项,可以选择1字节、2字节、4字节、8字节或默认值。
  3. 根据需要选择合适的对齐方式,例如选择“1字节”对齐可以减少结构体的内存占用,但可能会影响访问速度‌1。

此外,了解结构体成员对齐的基本原理和规则也很重要。结构体成员的对齐是为了提高CPU访问内存的效率,使得数据能够按照一定规则整齐地排列在内存中,便于CPU快速读取和处理。默认情况下,结构体成员会按照4字节或8字节对齐(具体取决于编译环境的配置)‌

/Zp(结构成员对齐)

  • 项目
  • 2024/08/03
  • 9 个参与者

反馈

本文内容

  1. 语法
  2. 注解
  3. 另请参阅

控制如何将结构成员打包到内存中,并在模块中为所有结构指定同一包装。

语法

]$

注解

/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 开发环境中设置此编译器选项

  1. 打开项目的“属性页” 对话框。 有关详细信息,请参阅在 Visual Studio 中设置 C++ 编译器和生成属性

  2. 选择“配置属性”>“C/C++”>“代码生成”属性页面。

  3. 修改“结构成员对齐”属性。

以编程方式设置此编译器选项

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

月巴月巴白勺合鸟月半

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值