gpt4 book ai didi

c++ - 为什么堆栈上对齐的整数之间有 "0xcc"的 8 字节填充? C++ 32 位 Windows 7

转载 作者:搜寻专家 更新时间:2023-10-31 00:39:21 27 4
gpt4 key购买 nike

int p;
int i1;
int i2;
i1 = 1 << 16;
i2 = 1 << 8;
p = int(&i1)+3;

cout << hex;
cout << "&i1: " << int(&i1) << endl;
cout << "&i2: " << int(&i2) << endl;
for(int i = 0; i < 16; i++)
cout << p << ": " << uint(*((byte*)p--)) << endl;

Output:

&i1: 12fac8
&i2: 12fabc
12facb: 0
12faca: 1
12fac9: 0
12fac8: 0
12fac7: cc
12fac6: cc
12fac5: cc
12fac4: cc
12fac3: cc
12fac2: cc
12fac1: cc
12fac0: cc
12fabf: 0
12fabe: 0
12fabd: 1
12fabc: 0

我正在运行 Windows 7 32 位,使用 Visual Studio 2010。没什么好说的,但是 stackoverflow 不会让我在没有更多“细节”的情况下发帖,所以这只是无用的废话:)

最佳答案

当您使用 /GZ 选项在 Visual C 中编译代码时,所有未初始化的堆栈变量都使用 0xcc 模式设置(我怀疑是为了帮助调试)。

因此,其中的那些字节可能是 pi 整数 (a),或者由 bizarre< 创建的临时值/em> 使用 int 作为指针的方法,您可能需要重新考虑一下。

无论如何,为什么它们存在于您的特定抽象级别(C++“虚拟机”)是无关紧要的。一个实现可以自由地组织堆栈,但是它想要提高效率,在需要的地方插入填充。


(a) 尽管稍后在代码中声明了 i,但没有什么可以阻止安装在函数入口处为其分配空间。大多数在幕后发生的事情都可能像这样令人惊讶,因为“好像”规则决定了实现的工作方式。只要效果符合标准,它就可以为所欲为。

关于c++ - 为什么堆栈上对齐的整数之间有 "0xcc"的 8 字节填充? C++ 32 位 Windows 7,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16313734/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com