【发布时间】:2018-08-10 20:19:48
【问题描述】:
当函数涉及重新分配时,我发现一些编译器可能会在函数调用之前保存地址。它导致返回值存储在无效地址中。
上面的描述中有一个例子来解释行为。
#include <stdio.h>
#include <vector>
using namespace std;
vector<int> A;
int func() {
A.push_back(3);
A.push_back(4);
return 5;
}
int main() {
A.reserve(2);
A.push_back(0);
A.push_back(1);
A[1] = func();
printf("%d\n", A[1]);
return 0;
}
有一些常见的C++编译器,测试结果如下。
- GCC(GNU 编译器集合):运行时错误或输出
1 - Clang:输出
5 - VC++:输出
5
这是未定义的行为吗?
【问题讨论】:
-
至少在 C++ 2014 标准中查看赋值运算符的描述。
-
“当函数涉及重定位时,我发现一些编译器可能会在函数调用之前保存地址” - 这些都不是你认为的意思。这与动态链接无关。 “当函数涉及重新分配”将是准确的。
-
好点。重新分配以某种方式意味着重新定位(创建新空间,移动东西),但在这里使用重新分配会更清楚,如果这是原作者的真正意思的话。
-
@Useless 他的意思很明显,与链接无关。他的意思是如果向量内容被重新定位(重新分配理论上可以使数据保持不动,在幕后使用
realloc的库),并且编译器可能已将数据的地址保存在调用周围的寄存器中push_back。我之前遇到过他所说的错误^Wissue,所以你可以说我有偏见,但是...... -
重读后我知道 OP 是什么意思,但是告诉人们事物的正确名称(或者他们使用的词的实际含义)并没有什么坏处。这些都是有用的信息。
标签: c++ gcc vector compiler-optimization compiler-bug