C++ 堆栈上的变量是连续的吗?
我想知道下面代码中的数组a和b在内存中是否是连续的:C++ 堆栈上的变量是连续的吗?,c++,variables,contiguous,C++,Variables,Contiguous,我想知道下面代码中的数组a和b在内存中是否是连续的: int main() { int a[3]; int b[3]; return 0; } a[0]、a[1]和a[2]应该是连续的,并且对于b应该是相同的,但是对于a将在哪里分配b,是否有任何保证 如果没有,有没有办法强制a和b彼此相邻?也就是说,它们在栈中被分配到相邻的位置。 < P>强> NO>强>,C++不能保证这些变量在内存中的位置。一个或两个甚至可能不在内存中(例如,如果它们已优化) 为了获得这两个之间的
int main() {
int a[3];
int b[3];
return 0;
}
a[0]
、a[1]
和a[2]
应该是连续的,并且对于b
应该是相同的,但是对于a
将在哪里分配b
,是否有任何保证
如果没有,有没有办法强制
a
和b
彼此相邻?也就是说,它们在栈中被分配到相邻的位置。 < P>强> NO>强>,C++不能保证这些变量在内存中的位置。一个或两个甚至可能不在内存中(例如,如果它们已优化)
为了获得这两个之间的相对排序,至少必须将它们封装成<代码>结构> <代码>或<代码>类< /代码>,即使这样,也要考虑填充/对齐。
不能保证单个变量在堆栈上彼此相邻。 在您的示例中,您可以通过以下操作“作弊”并模拟您正在寻找的内容:int main()
{
int buffer[6]
int *a = buffer;
int *b = buffer+3;
return 0;
}
现在,当你写到<代码> A[4 ] < /> >你会写到
和a
连续,可以将它们放在结构中。即使这样,您也必须处理诸如填充之类的细节。编译器不太可能在结构中相同类型的两个数组之间放置填充,对吗?为了满足对齐要求,它不是必需的,因此它可能是纯Devicement,或者编译器需要在成员之间的结构中留出可用空间。也许是某种破坏ABI的仪器。因此,我认为您可以使用一个断言来应对填充的可能性,该断言测量结构的大小,并确保没有填充。谢谢!我经常问这样的问题,因为除了其他人,我在任何地方都找不到答案。如果你不介意我问的话,你的信息是从哪里来的?是否有一些“c++圣经”涵盖了基本内存管理之类的内容?@Dievser:经验。《标准》根本没有提到这一点,我记得。:-)此外,我只是在相关章节中通过扫描文本进行了双重检查。虽然脚注4指出,如果程序永远也找不到对象,那么“如果”规则允许不存储对象,哪种方法可以让您半途而废。@Dievser您可以查看标准的工作草案,谢谢各位,我感谢你们的帮助。虽然如果代码使用b
而你做出了这样的改变…@SteveJessop-我希望如果有人在做这种事情,那么他们就会知道其中的风险 sizeof(a),那么代码主要是有问题的