Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/wordpress/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 堆栈上的变量是连续的吗?_C++_Variables_Contiguous - Fatal编程技术网

C++ 堆栈上的变量是连续的吗?

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++不能保证这些变量在内存中的位置。一个或两个甚至可能不在内存中(例如,如果它们已优化) 为了获得这两个之间的

我想知道下面代码中的数组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 buffer[6]
    int *a = buffer;
    int *b = buffer+3;

    return 0;
}

现在,当你写到<代码> A[4 ] < /> >你会写到>B[0 ] .P/>因为没有“栈”,所以这个问题不能用C++来回答。一个好的编译器不会在你的情况下分配任何东西,因为程序什么都不做。不,没有这样的保证。如果需要

a
b
连续,可以将它们放在结构中。即使这样,您也必须处理诸如填充之类的细节。编译器不太可能在结构中相同类型的两个数组之间放置填充,对吗?为了满足对齐要求,它不是必需的,因此它可能是纯Devicement,或者编译器需要在成员之间的结构中留出可用空间。也许是某种破坏ABI的仪器。因此,我认为您可以使用一个断言来应对填充的可能性,该断言测量结构的大小,并确保没有填充。谢谢!我经常问这样的问题,因为除了其他人,我在任何地方都找不到答案。如果你不介意我问的话,你的信息是从哪里来的?是否有一些“c++圣经”涵盖了基本内存管理之类的内容?@Dievser:经验。《标准》根本没有提到这一点,我记得。:-)此外,我只是在相关章节中通过扫描文本进行了双重检查。虽然脚注4指出,如果程序永远也找不到对象,那么“如果”规则允许不存储对象,哪种方法可以让您半途而废。@Dievser您可以查看标准的工作草案,谢谢各位,我感谢你们的帮助。虽然如果代码使用
sizeof(a),那么代码主要是有问题的
而你做出了这样的改变…@SteveJessop-我希望如果有人在做这种事情,那么他们就会知道其中的风险