【发布时间】:2019-03-10 12:18:25
【问题描述】:
这是我问这个问题的原因:
static ProfileUnit* g_units_header;
static ProfileUnit* g_units_tail;
static int g_units_count;
void Destroy() {
if (!g_units_header) {
return;
}
typedef std::vector<ProfileUnit*> PUVect;
PUVect stack(g_units_count);
ProfileUnit* p = g_units_header;
while (p) {
stack.push_back(p);
p = p->next;
}
for (PUVect::const_iterator it = stack.begin(); it != stack.end(); ++it) {
free(*it);
}
g_units_header = g_units_tail = nullptr;
g_units_count = 0;
}
如果“g_units_header”为nullptr,“stack”和“p”是否会在调用堆栈上?这不是一个很好的例子,我只是想解释一下这个场景。只关注问题。
【问题讨论】:
-
那个例子太简单了。任何好的编译器都会把它优化到一无所有,不管 p。
-
依赖编译器
-
如果
p为空,那么程序就不会访问val,所以编译器把它放在哪里都没有关系。就您的程序而言,它可以登上月球。 (这被称为“假设”规则。) -
@usrbin:更新后的示例使答案(如下面的我的示例)似乎与问题脱节,但并没有真正改变
val可以完全优化掉的事实(新添加的代码等效到return 1)。 -
您不仅完全更改了问题中的代码,而且将其更改为 C++,尽管问题标记为 C。请不要这样做。 SO 不是对话;它是旨在长期使用的问题和答案的存储库。可以修改问题以使其更精确,但不能是不同的问题。如果您更改问题,现有答案将断开连接,这对响应者不公平,对以后的读者无用。