C++ C语言中不连续的全局变量

C++ C语言中不连续的全局变量,c++,c,pointers,memory-management,C++,C,Pointers,Memory Management,目前,我们正在努力跟踪存储在内存中的变量,但是我们面临以下问题,也许您可以帮助我们解决 目前,我们在代码中定义了一些全局变量,如下所示 int x; char y; 我们添加了以下代码行 int main ( int argc, char *argv[ ] ){ printf("Memory of x %p\n",&x); printf("Memory of y %p\n",&y); system( "pause"); return 0; } 程序返回了以下地址 Memo

目前,我们正在努力跟踪存储在内存中的变量,但是我们面临以下问题,也许您可以帮助我们解决

目前,我们在代码中定义了一些全局变量,如下所示

int x;
char y;
我们添加了以下代码行

int main ( int argc, char *argv[ ] ){ 
printf("Memory of x %p\n",&x); 
printf("Memory of y %p\n",&y);
system( "pause");
return 0;
}
程序返回了以下地址

Memory of x 0x028EE80
Memory of y 0x028EE87
如果我做一个sizeof x和一个sizeof y,我得到4和1(integer和char类型的大小)
那么0x028EE84和0x028EE86之间是什么?为什么要在内存中插入char变量而不是在0x028EE81内存位置插入它需要7个位置?

因为编译器可以自由插入填充以获得更好的效果

如果您必须让它们在内存中紧靠在一起,请将它们放在
结构中
,并使用
#pragma pack
强制打包对齐为1(无填充)


这是技术上依赖于编译器的行为(不是由C++标准强制执行),但我发现它在主要编译器中是相当一致的。

,编译器通常会尝试做一个叫做对齐的东西。这意味着编译器将尝试使变量以2、4、8、16……的倍数结尾,这取决于机器架构。通过这样做,内存访问和写入速度更快。

这里已经有很多很好的答案,但是我觉得没有任何一个答案能够触及这个问题的核心。编译器决定将全局变量放置在内存中的不是由C或C++定义的。尽管程序员似乎可以方便地连续存储变量,但编译器拥有大量关于特定系统的信息,因此可以提供大量优化,可能导致它以起初不明显的方式使用内存

也许编译器决定将int放置在内存中具有相同对齐方式的其他类型的区域中,并将char粘贴在一些不需要对齐的字符串中


尽管如此,其本质是编译器没有义务或承诺将大多数类型的变量存储在内存中的什么位置,并且在阅读编译器的完整源代码之前,很难理解它为什么这样做。如果你非常关心这个问题,你就不应该使用单独的变量,考虑把它们放入一个结构中,然后这个结构有明确的内存放置规则(注意填充仍然是允许的)。< /P>这是一个64位的机器,对吧?这叫做对齐。这里有一个很好的解释:
int
在位置80、81、82、83处,
char
在位置84、85、86、87处,在最右边。仔细看看打印输出。变量之间的距离比你想象的要远得多。除非你有复制粘贴错误。你为什么要费心全局之间的内存空间?我的错,Joachim,非常感谢你,编辑了AlreadyTanks的结构建议。它实际上帮助我解决了一个问题(对大块变量进行校验和)。
#pragma pack(push, 1)

struct MyStruct
{
    int x;
    char y;
};

#pragma pack(pop)