C++ struct reinterpret_cast
C++ struct reinterpret_cast
假设有两个结构体A和b,它们有一个共同的结构体C。我想知道调用reinterpret_cast到A或B到C是否安全。如果没有,有没有办法在不影响性能的情况下做到这一点?
struct C
{
string m_c1;
int32_t m_c2;
double m_c3;
string m_c4;
};
struct A
{
C m_a1;
string m_a2;
int32_t m_a3;
};
struct B
{
C m_b1;
string m_b2;
int32_t m_b3;
double m_b4;
};
int main(int argc,char *argv[])
{
A a;
a.m_a1.m_c1="A";
a.m_a1.m_c4="AA";
B b;
b.m_b1.m_c1="B";
b.m_b1.m_c4="BB";
C* pc = reinterpret_cast<C*>(&a);
cout << pc->m_c1 << " " << pc->m_c4 << endl;
pc = reinterpret_cast<C*>(&b);
cout << pc->m_c1 << " " << pc->m_c4 << endl;
return 1;
}
Mike DeSimone指出,string
类不能保证是standard-layout
类,因此C
类不是standard-layout
类,这意味着您根本不能保证内存布局。所以不安全。只有当您将字符串更改为(const) char*
时,才能保证安全。
即使这样,它也只有在类的布局保持不变(你不能改变成员的顺序或改变它们的访问说明符),并且类没有任何变量的情况下才是安全的,这是"安全的",因为编译器会生成显示你想要的行为的代码。
这是软件开发人员很少能够提供的两个保证。这样写的代码也很难理解。另一个开发人员(或者同一个开发人员一个月后)可能会忽略这段代码(或者只是不理解它),并进行必要的更改,然后代码突然被破坏,并且您手头上有一些难以捕获的错误。
A
和B
是允许访问C
(或C
的某些成员)的类。更可读和更安全的解决方案是:
- 为
A
和B
创建一个访问器,这可能是内联的,不会产生性能损失。 - 如果有继承的原因,使用简单继承。
A
和B
is-aClassThatHasAC
或A
和B
is-aC
只要没有虚函数,您可能也不会在这里看到任何性能问题。在这两种情况下,访问器都可以为您提供好处,而且可能没有任何性能成本。
首先创建一些简单易读的代码,并测量性能。如果这个C访问开销太大,就进行优化。但是,如果你的优化归结为重新解释强制转换技巧,请确保周围有足够的警告标志,以确保没有人踩到这个陷阱。
为什么不从C继承A,B,然后使用static_cast
代替?应该更安全/更干净。
实际上,在您的情况下,您根本不需要强制转换,您应该能够将a或B ptrs分配给C*
相关文章:
- 如何理解C++标准N3337中的expr.const.cast子句8
- C++Cast运算符过载
- 错误:"cast"未命名类型void setCastDescription(std::string
- 通过使用 const-cast 的非常量引用来延长临时的寿命
- "(void) cast"与功能有什么区别 "__attributes__"来沉默未使用的参数警告?
- C++:"Expected '(' for function-style cast or type construction"错误
- 为什么选择 g++ 给予者:"error: cast to pointer from integer of different size [-Werror=int-to-pointer-cast]"
- Gtk+ g_signal_connect() 和 C++ lambda 会导致"invalid cast"错误
- Shared_ptr cast vs static_cast speed
- C++20 中的严格别名规则是否允许标准 c++ unicode 字符和下划线类型之间"reinterpret
- 在 iOS 上使用 Aruco 构建 OpenCV 时"Functional-style cast from id to double is not allowed"
- 覆盖 CAST 运算符(我认为它被称为向下转换)
- C++错误,隐 <function-style-cast> 式要求使用模板化类一次调用多个构造函数的多个转换
- 如何修复<function-style-cast>错误:无法从'initializer list'转换为asdending比较<W>(模板函子)
- C++ C++ 中的函数声明,键入 CAST
- static_cast会丢弃错误,但C风格的演员cast有效
- C++ cast char * to unsigned char
- 禁用 Clang 中的"cast from pointer to smaller type uint32_t"错误
- 是否可以使用gcc 3.3版修复与int*cast相关的Sun Solaris OS 5.8分段故障
- C++ const-cast 一个引用