内存中变量之间的距离 我想知道C++是如何处理变量的,因此在一个接一个地声明和初始化的整数变量内存中的两个地址之间的距离是3537492—3537480=12(我假设位(?))< /P> #包括 使用名称空间std; int main(int argc,字符**argv) { int x=1; int y=2; printf(“int:\t%d\n”,sizeof(int)); printf(“unsigned int:\t%d\n”,sizeof(unsigned int)); printf(“x\n\tHex:\t%p\n\tDec:\t%d\n”、&x、&x的地址); printf(“y\n\tHex:\t%p\n\tDec:\t%d\n”的地址,&y,&y); 返回0; }

内存中变量之间的距离 我想知道C++是如何处理变量的,因此在一个接一个地声明和初始化的整数变量内存中的两个地址之间的距离是3537492—3537480=12(我假设位(?))< /P> #包括 使用名称空间std; int main(int argc,字符**argv) { int x=1; int y=2; printf(“int:\t%d\n”,sizeof(int)); printf(“unsigned int:\t%d\n”,sizeof(unsigned int)); printf(“x\n\tHex:\t%p\n\tDec:\t%d\n”、&x、&x的地址); printf(“y\n\tHex:\t%p\n\tDec:\t%d\n”的地址,&y,&y); 返回0; },c++,memory,reference,64-bit,addressof,C++,Memory,Reference,64 Bit,Addressof,输出: int: 4 unsigned int: 4 Address of x Hex: 0035FA54 Dec: 3537492 Address of y Hex: 0035FA48 Dec: 3537480 内部:4 无符号整数:4 x的地址 十六进制:0035FA54 十二月:3537492 y的地址 十六进制:0035FA48 十二月:3537480 记忆中两个变量之间的距离通常是一个无意

输出:

int: 4 unsigned int: 4 Address of x Hex: 0035FA54 Dec: 3537492 Address of y Hex: 0035FA48 Dec: 3537480 内部:4 无符号整数:4 x的地址 十六进制:0035FA54 十二月:3537492 y的地址 十六进制:0035FA48 十二月:3537480
记忆中两个变量之间的距离通常是一个无意义的数字。主要的例外是两个数组元素

这也不例外:巧合的是,你得到的数字是12。如果你试图计算出“蓝色”在技术上是一个合法的结果。这是因为比较不相关的指针是未定义的行为,然后字面上任何事情都可能发生


此外,获得的值可能因运行而异。(在许多现代操作系统上,出于安全原因,情况就是这样。当程序一直在运行时,很难破解它)

内存中两个变量之间的距离通常是一个无意义的数字。主要的例外是两个数组元素

这也不例外:巧合的是,你得到的数字是12。如果你试图计算出“蓝色”在技术上是一个合法的结果。这是因为比较不相关的指针是未定义的行为,然后字面上任何事情都可能发生


此外,获得的值可能因运行而异。(在许多现代操作系统上,出于安全原因,这种情况是存在的。当程序一直在运行时,很难对其进行黑客攻击)

我的猜测是,出于某种性能原因,编译器正在沿着字边界对齐整数。如果一个字是128位或16字节,那么这种行为将导致变量之间的距离为12字节。你必须对你正在编译的体系结构有更多的了解,才能知道我是否正确。没有双关语的意思。请参见

我的猜测是,出于某种性能原因,编译器正在沿字边界对齐整数。如果一个字是128位或16字节,那么这种行为将导致变量之间的距离为12字节。你必须对你正在编译的体系结构有更多的了解,才能知道我是否正确。没有双关语的意思。请参见

我想您是在Visual Studio调试配置中编译此代码的。在此模式下,编译器在变量之间进行额外的内存分配,以检测可能的堆栈损坏。尝试切换到Release,您将看到距离变为原来的4个字节。 有关该主题的更多信息:

我想您是在Visual Studio调试配置中编译此代码的。在此模式下,编译器在变量之间进行额外的内存分配,以检测可能的堆栈损坏。尝试切换到Release,您将看到距离变为原来的4个字节。 有关该主题的更多信息:

它是12个字节而不是位。您计算的差异是字节数。C++如何处理变量是完全平台,编译器设置具体的。在某些情况下,变量根本不在内存中。您的问题是什么?使用该选项显示编译器生成的程序集,并查看它如何布局内存。您的程序具有未定义的行为:
%p
需要一个
void*
参数,而
%d
需要一个
int
参数。它是12个字节而不是位。您计算的差值是字节数。C++如何处理变量是完全平台,编译器设置具体的。在某些情况下,变量根本不保存在内存中。您的问题是什么?使用该选项显示编译器生成的程序集,并查看它如何布局内存。您的程序具有未定义的行为:
%p
需要一个
void*
参数,
%d
需要一个
int
参数。理论上,编译器可以决定将指针实现为字符串吗?实际上,它们必须是固定长度(
sizeof(T*)
是一个常量)。理论上,编译器可以决定将指针实现为字符串吗?实际上,它们必须是固定长度(
sizeof(T*)
是一个常量)。我认为这里不可能是这种情况。首先,12字节是变量的起始地址之间的差异,而不是它们之间的间隙长度。其次,十六进制值清楚地表明两个变量都不是16字节对齐的。(也就是说,最低有效十六进制数字不是零。)我认为这里不可能是这种情况。首先,12字节是变量的起始地址之间的差异,而不是它们之间的间隙长度。其次,十六进制值清楚地表明两个变量都不是16字节对齐的。(即,最低有效十六进制数字不为零。) int: 4 unsigned int: 4 Address of x Hex: 0035FA54 Dec: 3537492 Address of y Hex: 0035FA48 Dec: 3537480