两个static_cast比reinterpret_cast好吗?

我使用平面缓冲区,需要将数据写入文件。 flatbuffer结构返回uint8_t *,但是std :: ofstream :: write将char *作为参数。 您能告诉我哪种方法更好地使用两个static_casts或reinterpret_cast方法,为什么?

    flatbuffers::flatBufferBuilder fbBuilder // flatbuffer structer 
    ... // write something to fbBuilder
    std::ofstream out(filename);
    // this
    out.write(static_cast<const char*>(static_cast<const void*>(fbBuilder.GetBufferPointer())),fbBuilder.GetSize());
    // or this ? 
    out.write(reinterpret_cast<const char*>(fbBuilder.GetBufferPointer())),fbBuilder.GetSize());
drx321 回答:两个static_cast比reinterpret_cast好吗?

在这种情况下,静态强制转换不会增加安全性:void*的静态强制转换与重新解释强制转换同样危险。实际上,重新解释类型转换是根据void*进行类型转换定义的,因此示例在语法上几乎完全相同。

两个静态类型转换比单个重新解释类型转换更长,更难阅读。

,

仅供参考,在此示例中,您无需强制转换为constGetBufferPointer()返回非常量uint8_t*,并且您可以将非常量char*传递给ostream::write()。可以将指向非常量的指针分配给指向const的指针,编译器将为您隐式应用const。因此,一次强制转换就足够了,在这种情况下,需要reinterpret_castuint8_t*直接转换为char*

out.write(reinterpret_cast<char*>(fbBuilder.GetBufferPointer()),fbBuilder.GetSize());
,

static_cast等效于reinterpret_cast

https://en.cppreference.com/w/cpp/language/reinterpret_cast

5)任何对象指针类型T1 *都可以转换为另一个对象指针类型 cv T2 *。这完全等同于static_cast< cv T2*> (static_cast< cv void*> (expression))(这意味着如果T2的对齐要求不严格于T1的对齐要求,则指针的值不会更改,并且将结果指针转换回其原始类型将产生原始值)。无论如何,只有在 type aliasing 规则允许的情况下,才能安全地取消对结果指针的引用(请参见下文)

在这种情况下,使用reinterpret_cast是惯用的,例如,ostream::write()的示例代码使用reinterpret_cast

https://en.cppreference.com/w/cpp/io/basic_ostream/write

#include <iostream>

int main()
{
    int n = 0x41424344;
    std::cout.write(reinterpret_cast<char*>(&n),sizeof n) << '\n';

    char c[]="This is sample text.";
    std::cout.write(c,4)<<'\n';
}
本文链接:https://www.f2er.com/2637149.html

大家都在问