gpt4 book ai didi

C++ reinterpret_cast - 这总是能正常工作吗?

转载 作者:行者123 更新时间:2023-11-30 03:55:57 28 4
gpt4 key购买 nike

我已经编写了 MyString 和 MyStringConst 类。现在我需要不时地将 MyString 作为 MyStringConst 传递,因此重载强制转换运算符。这是我写的

MyString::operator const MyStringConst &() const
{
return reinterpret_cast<const MyStringConst &>(*this);
}

MyString 有这个数据

char * str;
int length;
volatile int hashCode;
int bufferSize;

MyStringConst 有这个数据

const char * c_str;
int length;
volatile int hashCode;

还有一些方法,可以在两个字符串中重新计算hashCode。

这段代码是否正确编写。我已经在 MSVC 2013 上对其进行了测试并且它工作正常,但我不知道它是否可以用于生产代码,可以使用不同的编译器进行编译。

最佳答案

数据成员的公共(public)初始序列是不同的,C++ 根本不保证这种情况下的布局,即使类型仅在 const 限定上有所不同。否则,union 的保证将有效地暗示如果这些类型是标准布局类型(根据 9.5 [class.union] 第 1 段中的注释),则它们需要具有通用布局。

在实践中,我希望这两种类型的布局相同,并且 reinterpret_cast 有效,但标准并不能保证。根据您的评论 MyStringConst 仅包含指向字符串的指针,即,我不会转换为引用,而是返回一个适当构造的 MyStringConst 并避免依赖未定义的行为:

MyString::operator MyStringConst() const {
return MyStringConst(str, length);
}

MyString 对象仍然必须与转换结果一样长,但这与使用 reinterpret_cast 的情况没有什么不同。

顺便说一句,hashCode 上的volatile 是不明智的:它唯一的影响就是减慢程序速度。我猜你正试图用它来实现线程之间的同步,但在 C++ volatile 中根本没有帮助:当在一个线程中写入成员时,你会发生数据竞争,它也是非同步访问的在另一个线程中。你会拼写成员

std::atomic<int> hashCode;

相反。

关于C++ reinterpret_cast - 这总是能正常工作吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28792554/

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