C++ 如何从char*转换为T*?

C++ 如何从char*转换为T*?,c++,pointers,casting,C++,Pointers,Casting,可能重复: 哪个更好 static_cast<T *>(static_cast<void *>(buffer)); static_cast(static_cast(buffer)); 或 reinterpret\u cast(缓冲区); 其中,buffer是char*(包含类型T的值的内存块)。如果确实需要这样做,请重新解释\u cast。它比静态强制转换更容易理解。-它不太依赖于实现。重新解释强制转换应用于将整型强制转换回其原始类型。如果char*最初确实是T*

可能重复:

哪个更好

static_cast<T *>(static_cast<void *>(buffer));
static_cast(static_cast(buffer));

reinterpret\u cast(缓冲区);

其中,
buffer
char*
(包含类型
T
的值的内存块)。

如果确实需要这样做,请重新解释\u cast。它比静态强制转换更容易理解。

-它不太依赖于实现。

重新解释强制转换
应用于将整型强制转换回其原始类型。如果
char*
最初确实是
T*
,那么
reinterpret\u cast
将做正确的事情。如果您正在玩其他游戏,那么您应该使用
static\u cast

使用reinterpret\u cast,因为这是您在概念上所做的。当您希望编译器知道如何进行转换时,可以使用static_cast。这是一种安全机制,因为如果编译器实际上不知道如何操作,它将生成一个错误。当你想说“相信我,这里的比特是这种类型的”时,可以使用Reinterpret_cast.

没有人更好,问题是哪一个更坏

如果缓冲区真的是一个T,那么
static_cast
就可以保证工作。您可以将其地址转换为
void*
,然后再转换回来。如果是其他类型,则取决于实现是否工作。对齐问题只是潜在问题之一

使用
reinterpret\u cast
始终取决于实现。因此,它并没有更好的工作方式,但至少它表明这不是可移植代码


因此,我会在这里使用
reinterpret\u cast

可能先在这里阅读:这个案例如何?这里我有一些不同于您所说的内容,我有一个内存池,它是以这种方式创建的
new char[size]
,在那里我通过placement操作符new创建T类型的对象,为了确定创建新对象的位置,我使用了
some\u cast(缓冲区)+下一个对象位置
这就是我要问的问题。链接不错,但请注意,第一个答案最后指出,
重新解释投射
也保证有效。
reinterpret_cast<T *>(buffer);