问题标签 [reinterpret-cast]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - 执行变量原始副本的简单转换是否会破坏严格的别名?
我最近一直在阅读有关严格混叠的文章。C/C++ 标准说以下代码是无效的(未定义的行为是正确的),因为编译器可能在a
某处缓存了值,并且在我更新时不会识别它需要更新值b
;
该标准还说char*
可以为任何东西加上别名,因此(如果我错了,请纠正我)编译器会在对char*
变量进行写访问时重新加载所有缓存的值。因此,以下代码将是正确的:
但是在根本不涉及指针的情况下呢?例如,我有以下代码,GCC 会向我抛出关于严格别名的警告。
我想要做的只是复制原始值a
,所以不应该应用严格的别名。这里是否存在可能的问题,或者只是 GCC 对此过于谨慎?
编辑
我知道有一个使用memcpy的解决方案,但它导致代码的可读性要差得多,所以我不想使用那个解决方案。
编辑2
int32_t b = *reinterpret_cast<int*>(&a);
也不起作用。
解决了
这似乎是GCC 中的一个错误。
c++ - reinterpret_cast 用于几乎 pod 数据(布局兼容性是否足够)
我正在尝试了解static_cast
和reinterpret_cast
。
如果我是正确的,标准(9.2.18)说reinterpret_cast
对于 pod 数据是安全的:
一个指向 POD 结构对象的指针,使用 a 进行适当转换
reinterpret_cast
,指向它的初始成员(或者如果该成员是位字段,则指向它所在的单元),反之亦然。[注意:因此,在 POD 结构对象中可能存在未命名的填充,但不是在其开头,这是实现适当对齐所必需的。——尾注]
我的问题是如何严格解释这一点。例如,布局兼容性是否足够?如果没有,为什么不呢?
对我来说,以下示例显示了一个示例,其中严格的“仅 POD 有效”解释似乎是错误的。
complex_base::m_data
此外,如果受到保护(这意味着complex_base
不是 pod),可能会破坏什么?[编辑:以及如何保护自己/检测此类破损]
在我看来,布局兼容性应该足够了——但这似乎不是标准所说的。
编辑:感谢您的回答。他们还帮我找到了这个, http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2342.htm
c++ - std::complex 是否以交错方式存储?
也就是说,在磁盘上,如果我有一个数组std::complex
,它是存储的RIRIRIRI
还是RRRRIIII
其他的?
我真正的问题是 - 如果我定义了一个包含两个数字的结构,我可以重新解释我的结构的数组以使用需要数组的函数std::complex
吗?
那么memcpy呢?如果我的两个结构都是浮动的,如果它们存储相同,那应该可以吗?
c++ - 我可以通过 reinterpret_cast 将 int 的空指针转换为 long 类型吗
int *pt = 0;
long i = reinterpret_cast<long>(pt);
我保证为0吗?这是定义明确的还是实现定义的?我检查了 c++ 标准,但它只说明
指向数据对象或函数的指针(但不是指向成员的指针)可以转换为任何大到足以包含它的整数类型。
在这种情况下,pt 不指向任何数据对象。该规则是否适用于本案?
c++ - 铸造成员函数指针
我需要使用一个成员函数指针,它接受在其他代码中使用的基类的参数。好吧,我只是想做一些类似下面例子的事情。这段代码工作正常,但我想知道这样的演员是否总是安全的?我不能在这里做dynamic
或static
投。
c++ - 为什么将指针转换回原始类时会出现奇怪的行为?
假设在我的代码中,我必须将一个void*
作为数据成员存储并在需要时将其类型转换回原始class
指针。为了测试它的可靠性,我写了一个测试程序(linux ubuntu 4.4.1 g++ -04 -Wall),看到这个行为我很震惊。
这只是一个测试程序;实际上,对于我的情况,必须将任何指针存储为void*
,然后将其转换回实际指针(在 的帮助下template
)。所以我们不要担心那部分。上述代码的输出是,
但是,如果您将其更改void* p;
为A* p;
它会给出预期的行为。为什么 ?
另一个问题,我无法逃避,(A*&)
否则我无法使用operator ++
;但它也会发出警告,因为取消引用类型双关指针会破坏严格的别名规则。有什么体面的方法来克服警告吗?
c++ - 以特定偏移量和类型重新解释原始结构的安全方法?
结构是 pragma packed 1 并且包含一堆 uint、char、short 字段...
既然它是 UInt32,是否应该首先将其 reinterpret_cast 改为 unsigned char* 或者它是否重要?
此外,速度在这里很关键,我相信 reinterpret_cast 是最快的演员,而不是 static_cast。
编辑:该结构实际上由两个单字节字段组成,后跟大约 16 个其他结构的联合,其中 15 个将 UInt32 作为其第一个字段。我快速检查一下它不是没有的,然后对 2 字节偏移量执行 reinterpret_cast。
c++ - C++ 我们什么时候应该更喜欢使用两个链接的 static_cast 而不是 reinterpret_cast
首先,这不是重复为什么我们在 C++ 中有 reinterpret_cast 当两个链式 static_cast 可以完成它的工作?.
我知道我们甚至不能使用两个链式static_cast
来实现这一点的情况,是什么reinterpret_cast
。但是在任何情况下,我应该更喜欢两个链接static_cast
而不是简单且更具可读性reinterpret_cast
吗?
c++ - 在 C++ 中使用 reinterpret_cast
只是一个简单的问题,有这个:
有什么区别:
和
非常感谢提前
安东尼奥