gpt4 book ai didi

c++ - const_cast(this) 性能命中

转载 作者:塔克拉玛干 更新时间:2023-11-03 08:15:19 25 4
gpt4 key购买 nike

据我所知,在类中创建常量函数对于读/写编译器优化很有用。

类中的常量函数意味着类成员在函数执行期间将保持不变。但是,您可以通过 const 强制转换隐式参数来绕过此问题(当然,这是一种非常糟糕的做法)。

我的问题如下:

以下代码会导致哪些陷阱(尤其是在与线程同步无关的性能方面)?

 int myClass::getSomething() const
{
myClass* writableThis = const_cast<myClass*>(this);
writableThis->m_nMemberInt++;
...
return m_nSomeOtherUnchangedMember;
}

另一个相关问题:

行为是否特定于编译器/平台/操作系统?

如果有人能解释编译/执行此类代码时的幕后魔力,我也将非常感激(我推测 CPU 正在根据以下事实进行乱序优化: const ,并且在实际执行期间不遵守这一点应该会产生一些副作用)。

编辑:

感谢您为我澄清这一点。经过进一步研究,收到的所有答案都是正确的,但我只能接受一个:)。

关于仅用于语法正确性的 const 限定符,我相信这个答案既是对又是错误的,正确的表述方式(恕我直言)是它主要用于语法正确性(在数量非常有限的情况下)它可以产生不同/更好的代码的场景)。引用文献:SO Related question , related article

最佳答案

const_cast<T>(this)技巧可能是不安全的,因为您的成员函数的用户可能会遇到未定义的行为,而他们并没有做错任何事情。

问题是,只有当您从非 const 对象开始时,才允许放弃 const-ness。如果您的对象是常量,则放弃其常量并使用结果指针来更改对象状态的函数会触发未定义的行为:

struct Test {
int n;
Test() : n(0) {}
void potentiallyUndefinedBehavior() const {
Test *wrong = const_cast<Test*>(this);
wrong->n++;
}
};

int main() {
Test t1;
// This call is OK, because t1 is non-const
t1.potentiallyUndefinedBehavior();
const Test t2;
// This triggers undefined behavior, because t2 is const
t2.potentiallyUndefinedBehavior();
return 0;
}

const_cast<T>(this) 的技巧已发明用于缓存成员函数内的值 const预选赛。然而,它不再有用,因为 C++ 为这类事情添加了一个特殊的关键字:通过标记一个成员 mutable你让那个成员在里面可写 const - 合格的方法:

struct Test {
mutable int n;
Test() : n(0) {}
void wellDefinedBehavior() const {
n++;
}
};

现在 const无论上下文如何,成员函数都不会触发未定义的行为。

关于c++ - const_cast(this) 性能命中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27783236/

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