问题标签 [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.

0 投票
3 回答
417 浏览

c++ - 执行变量原始副本的简单转换是否会破坏严格的别名?

我最近一直在阅读有关严格混叠的文章。C/C++ 标准说以下代码是无效的(未定义的行为是正确的),因为编译器可能在a某处缓存了值,并且在我更新时不会识别它需要更新值b

该标准还说char*可以为任何东西加上别名,因此(如果我错了,请纠正我)编译器会在对char*变量进行写访问时重新加载所有缓存的值。因此,以下代码将是正确的:

但是在根本不涉及指针的情况下呢?例如,我有以下代码,GCC 会向我抛出关于严格别名的警告。

我想要做的只是复制原始值a,所以不应该应用严格的别名。这里是否存在可能的问题,或者只是 GCC 对此过于谨慎?

编辑

我知道有一个使用memcpy的解决方案,但它导致代码的可读性要差得多,所以我不想使用那个解决方案。

编辑2

int32_t b = *reinterpret_cast<int*>(&a);也不起作用。

解决了

这似乎是GCC 中的一个错误

0 投票
2 回答
1342 浏览

c++ - reinterpret_cast 用于几乎 pod 数据(布局兼容性是否足够)

我正在尝试了解static_castreinterpret_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

0 投票
4 回答
2028 浏览

c++ - std::complex 是否以交错方式存储?

也就是说,在磁盘上,如果我有一个数组std::complex,它是存储的RIRIRIRI还是RRRRIIII其他的?

我真正的问题是 - 如果我定义了一个包含两个数字的结构,我可以重新解释我的结构的数组以使用需要数组的函数std::complex吗?

那么memcpy呢?如果我的两个结构都是浮动的,如果它们存储相同,那应该可以吗?

0 投票
4 回答
2334 浏览

c++ - 我可以通过 reinterpret_cast 将 int 的空指针转换为 long 类型吗

int *pt = 0;
long i = reinterpret_cast<long>(pt);

我保证为0吗?这是定义明确的还是实现定义的?我检查了 c++ 标准,但它只说明

指向数据对象或函数的指针(但不是指向成员的指针)可以转换为任何大到足以包含它的整数类型。

在这种情况下,pt 不指向任何数据对象。该规则是否适用于本案?

0 投票
4 回答
8281 浏览

c++ - 铸造成员函数指针

我需要使用一个成员函数指针,它接受在其他代码中使用的基类的参数。好吧,我只是想做一些类似下面例子的事情。这段代码工作正常,但我想知道这样的演员是否总是安全的?我不能在这里做dynamicstatic投。

0 投票
3 回答
855 浏览

c++ - 为什么将指针转换回原始类时会出现奇怪的行为?

假设在我的代码中,我必须将一个void*作为数据成员存储并在需要时将其类型转换回原始class指针。为了测试它的可靠性,我写了一个测试程序(linux ubuntu 4.4.1 g++ -04 -Wall),看到这个行为我很震惊。

这只是一个测试程序;实际上,对于我的情况,必须将任何指针存储为void*,然后将其转换回实际指针(在 的帮助下template)。所以我们不要担心那部分。上述代码的输出是,

但是,如果您将其更改void* p;A* p;它会给出预期的行为为什么 ?

另一个问题,我无法逃避,(A*&)否则我无法使用operator ++;但它也会发出警告,因为取消引用类型双关指针会破坏严格的别名规则。有什么体面的方法来克服警告吗?

0 投票
4 回答
2071 浏览

c++ - 以特定偏移量和类型重新解释原始结构的安全方法?

结构是 pragma packed 1 并且包含一堆 uint、char、short 字段...

既然它是 UInt32,是否应该首先将其 reinterpret_cast 改为 unsigned char* 或者它是否重要?

此外,速度在这里很关键,我相信 reinterpret_cast 是最快的演员,而不是 static_cast。

编辑:该结构实际​​上由两个单字节字段组成,后跟大约 16 个其他结构的联合,其中 15 个将 UInt32 作为其第一个字段。我快速检查一下它不是没有的,然后对 2 字节偏移量执行 reinterpret_cast。

0 投票
6 回答
1331 浏览

c++ - C++ 我们什么时候应该更喜欢使用两个链接的 static_cast 而不是 reinterpret_cast

首先,这不是重复为什么我们在 C++ 中有 reinterpret_cast 当两个链式 static_cast 可以完成它的工作?.

我知道我们甚至不能使用两个链式static_cast来实现这一点的情况,是什么reinterpret_cast。但是在任何情况下,我应该更喜欢两个链接static_cast而不是简单且更具可读性reinterpret_cast吗?

0 投票
2 回答
555 浏览

c++ - 我可以举一个真实的例子,通过 void* 进行投射而 reinterpret_cast 不起作用?

有一组关于交叉转换(从转换T1*到不相关T2*)的问题,例如thisthis。答案通常是这样的:reinterpret_cast是实现定义的,并且转换到void*后面static_cast是明确定义的。然而,我还没有看到任何真实的例子说明reinterpret_cast使用时会出现什么问题。

有哪些现实生活中的例子可以通过void*有效而reinterpret_cast无效?

0 投票
3 回答
741 浏览

c++ - 在 C++ 中使用 reinterpret_cast

只是一个简单的问题,有这个:

有什么区别:

非常感谢提前

安东尼奥