gpt4 book ai didi

c++ - 为什么编译器不优化这个负载

转载 作者:太空狗 更新时间:2023-10-29 20:23:02 29 4
gpt4 key购买 nike

在下面的c++程序中:

struct O
{
const int id;
};

extern void externalFunc();

int func(O* o)
{
//first load of o->id happens here:
int first = o->id;
externalFunc();

//second load happens here, but why?
return o->id + first;
}

Clang 和 MSVC 都对编译此代码进行了所有优化,其中 o->id 值从内存中加载两次。

为什么这些编译器无法去除二次加载?我试图告诉编译器通过将 id 成员标记为 const 可以保证该值不会更改,但显然两个编译器都没有找到足够的保证。如果我删除对 externalFunc() 的调用,它们会优化掉第二个负载。我如何说服编译器这个值真的不会改变?

最佳答案

考虑:

#include <iostream>

struct O
{
const int id;
O(int x) : id(x) {}
};

O* global = nullptr;

void externalFunc() {
global->~O();
new(global) O(42);
}

int func(O* o)
{
int first = o->id;
externalFunc();
// o->id has changed, even though o hasn't
return o->id + first;
}

int main()
{
O o(1);
global = &o;
std::cout << func(&o);
}

输出:43Demo

关于c++ - 为什么编译器不优化这个负载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35064952/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com