关于栈中储存数据地址增长方向及内存分配连续性问题(求详解)
定义了如下一段测试程序
int _tmain(int argc, _TCHAR* argv[])
{
char a[10]={0};
char b=0;
char c=0;
return 0;
}
新建了两个工程,环境都没有修改,是默认的环境
查看 a,b,c三个数据的地址
程序一结果:
a/b/c三个数据的储存地址由低至高排列
a、b地址不连续,b、c地址连续
程序二结果:
a/b/c三个数据的储存地址由高至低排列
a、b、c地址都不连续
请问这是为什么
按道理说,上述代码没有涉及到内存对齐的问题,内存应该是连续分配的。采用的是相同的编译环境,栈中数据地址增长方向应该保持一致才对呀?
[解决办法]
增长方向的问题太诡异,一般来说,x86的栈都是向低地址增长的
a和b肯定是不连续的,a是个10个字符的数组的地址,bc连续不连续和编译器,优化,debug/release版本都有关,我在gcc里试了几次都是连续的,你注意一下是不是两个工程一个debug版,一个release版,也可以disassemble看看汇编代码
[解决办法]
[解决办法]
栈是向低地址增长的,但这不是C++规定的,而是操作系统的惯例
C++也没有规定局部变量须按你声明的顺序分配内存
但对于数组和结构,C++则保证成员按声明的顺序分配,但也未必是紧挨的,因为对齐问题
下例中,k的地址会比i,j的地址低,但是i和j的地址顺序,则无规定
- C/C++ code
void func(){ int k;}int main(){ int i,j; func(); return 0;}
[解决办法]
g++的具体实现,似乎在某些情况下会调整结构和对象的成员顺序,它有一个-Wreorder编译开关,在这种情况下给出警告。