我有一个程序在 gcc 上几乎立即结束-O0
,但在 gcc 和-O3
. 如果我删除[[gnu::pure]]
函数属性,它也会立即退出,即使该函数没有修改全局状态。该程序位于三个文件中:
thread.hpp
#include <atomic>
extern ::std::atomic<bool> stopthread;
extern void threadloop();
[[gnu::pure]] extern int get_value_plus(int x);
thread.cpp
#include <thread>
#include <atomic>
#include "thread.hpp"
namespace {
::std::atomic<int> val;
}
::std::atomic<bool> stopthread;
void threadloop()
{
while (!stopthread.load())
{
++val;
}
}
[[gnu::pure]] int get_value_plus(int x)
{
return val.load() + x;
}
main.cpp
#include <thread>
#include "thread.hpp"
int main()
{
stopthread.store(false);
::std::thread loop(threadloop);
while ((get_value_plus(5) + get_value_plus(5)) % 2 == 0)
;
stopthread.store(true);
loop.join();
return 0;
}
这是编译器错误吗?缺乏正确使用注意事项的文档[[gnu::pure]]
?对文档的误读导致[[gnu::pure]]
我编写了一个错误?