gpt4 book ai didi

c++: "pointer to const"指向的对象被认为是不变的还是不可修改的?

转载 作者:搜寻专家 更新时间:2023-10-31 01:42:17 25 4
gpt4 key购买 nike

在以下情况下,“指向 const bool 的指针”参数 pbAbort 是有意义的,因为 worker 函数不会修改 bool 对象。但是,我担心编译器可能会优化掉对 bool 值的多次检查,除非我使用普通的“指向 bool 的指针”。 bool 是一个可以由管理器线程设置的标志。

void runWorkManager(DataSet& data)
{
bool bAbort = false;
callWorkerFuncFromNewThread(data, &bAbort);
while(!(data.isWorkCompleted || data.isWorkAborted))
{
updateGuiWithProgress(data.progress);
if(userWantsToAbort())
bAbort = true;
}
}
void workerFunc(DataSet& data, bool const *const pbAbort)
{
data.doPreWork();
if(*pbAbort) //Check #1
{
data.isWorkAborted = true;
return;
}

for(int i = 0; i < 100; ++i)
{
data.doWorkN(i);
if(*pbAbort) //Check #2
{
data.isWorkAborted = true;
return;
}
}
data.isWorkCompleted = true;
}

如果假定 *pbAbort 永远不会改变,那么编译器可以删除 Check #2 block 。

C++ 11 标准 7.1.6.1.3 指出:

A pointer or reference to a cv-qualified type need not actually point or refer to a cv-qualified object, but it is treated as if it does; a const-qualified access path cannot be used to modify an object even if the object referenced is a non-const object and can be modified through some other access path.

不幸的是,这个陈述并没有完全回答我的问题。

最佳答案

为了回答您的问题,如果编译器不相信变量正在被修改,它可以优化多次读取,无论对象是否为 const。考虑到读取线程中的代码路径不写入变量,这很可能发生在您的代码中。

这里需要注意的是,您的程序实际上包含未定义的行为;默认情况下,跨线程读取写入变量不是原子的。为了安全地执行此操作,您需要一个 atomic<bool> .另见 this question .另外,不要使用 volatile .它将解决您的重新排序问题,但可以访问 volatile变量仍然不是原子的(因此仍然是 UB)。

标准声明没有回答您的问题的原因是它讨论的是在一个线程内进行读写。

关于c++: "pointer to const"指向的对象被认为是不变的还是不可修改的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27195716/

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