【问题标题】:reinterpret_cast vs. static_cast for writing bytes in standard-layout types?reinterpret_cast 与 static_cast 在标准布局类型中写入字节?
【发布时间】:2014-08-28 21:39:25
【问题描述】:

我需要写入某些整数类型的单个字节。我应该使用reinterpret_cast,还是应该通过void* 使用static_cast

(a)

unsigned short v16;
char* p = static_cast<char*>(static_cast<void*>(&v16));
p[1] = ... some char value
p[0] = ... some char value

或(b)

unsigned short v16;
char* p = reinterpret_cast<char*>(&v16);
p[1] = ... some char value
p[0] = ... some char value

根据static_cast and reinterpret_cast for std::aligned_storageanswer 两者应该是等价的——

-- 如果 T1 和 T2 都是标准布局类型并且对齐 T2的要求不比T1严格

我倾向于reinterpret_cast,因为这基本上我正在做的事情,不是吗?

还有其他需要考虑的事情吗,特别是 Visual-C++ 和 VC8,我们目前正在编译的版本? (仅限 x86 atm。)

【问题讨论】:

    标签: c++ c++11 reinterpret-cast visual-c++-2005 standard-layout


    【解决方案1】:

    在这种情况下(转换对象指针),reinterpret_cast 等同于通过void* 嵌套的两个static_cast

    5.2.10 重新解释演员表 [expr.reinterpret.cast]

    7 对象指针可以显式转换为对象指针 72 当对象指针类型的纯右值 v 是 转换为对象指针类型“pointer to cv T”,结果为 static_cast&lt;cv T*&gt;(static_cast&lt;cv void*&gt;(v))。转换prvalue 将“指向 T1 的指针”键入“指向 T2 的指针”(其中 T1 和 T2 是 对象类型和 T2 的对齐要求没有 比 T1 更严格)并返回其原始类型产生 原始指针值。

    最好使用reinterpret_cast 在此处表明您的意图

    更新:正如 cmets 中所述,这显然是在 C++11 中添加的,尽管大多数 C++98 编译器已经支持它(另请参阅 this Q&A

    【讨论】:

    • 顺便说一句,它在 C++11 中是一个新奇事物。 C++98好像没有这个子句。
    • 据我所知,在 C++98 中,您可以合法使用 reinterpret_cast 生成的指针做一件事,即reinterpret_cast它回来了。
    • @AndreyChernyakhovskiy 我发现了另一个问答,他们声称大多数 c++98 编译器已经支持这一点,并且在 c++11 中正式合法
    • 我认为reinterpret_cast 一直是最自然、最常见的演员阵容,而我一直对标准中没有反映这一点感到困惑。
    • 我会使用 reinterpret_cast... 但请注意您平台上的字节序。 p[0] 可能不是 unsigned short 的低 8 位。
    猜你喜欢
    • 1970-01-01
    • 2018-04-21
    • 2016-05-28
    • 1970-01-01
    • 2013-10-18
    • 1970-01-01
    • 2013-05-11
    • 2023-02-10
    相关资源
    最近更新 更多