- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
来自 C++ 标准:
5.2.10.3
The mapping performed by reinterpret_cast might, or might not, produce a representation different from the original value.
我在这个网站接受过培训,相信并重复这一点。 (即使可能只是琐事)。从 float*
到 int*
的 reinterpret_cast
被允许产生不同的位模式。唯一的保证是 reinterpret_cast
将结果返回到 float*
将产生原始位模式。
我的问题:这会发生吗?是否存在实际 reinterpret_cast
为不同位模式的现有真实平台或 CPU 或编译器?如果不是,是否存在任何 reinterpret_cast
具有任何运行时开销的真实情况?
根据我所有使用 reinterpret_cast
的经验,转换是针对编译器的指令,而不是运行时。
最佳答案
指针原则上可以有不同的大小。最大的指针,如果有任何区别(忽略成员指针,谈论真正的指针),是 char*
, 因为 char
根据定义是一个字节,可以在任何地方,不需要对齐。 void*
必须能够表示 char*
.
在带有 int*
的系统上使用比 char*
更少的位,朝那个方向重新解释转换可能有点冒险。
我认为通过这些指针(嘿)您可以在标准中找到它。是关于void*
的要求对于任何指针都足够大,以及关于对齐的事情:越严格/越大,指向该类型的指针所需的位数越少。但我从未听说过任何现存的系统存在这种差异。
关于 void*
的标准语能够代表char*
:
C++11 §3.9.2/4:
”
A pointer to cv-qualified (3.9.3) or cv-unqualifiedvoid
can be used to point to objects of unknown type. Such a pointer shall be able to hold any object pointer. An object of type cvvoid*
shall have the same representation and alignment requirements as cvchar*
“任何对象指针”含糊地暗示有不同大小的指针。
关于所指对象对齐的标准语:
C++11 §5.2.10/7:
”
An object pointer can be explicitly converted to an object pointer of a different type. When a prvaluev
of type “pointer toT1
” is converted to the type “pointer to cvT2
”, the resultis static_cast<
cvT2*>(static_cast<
cvvoid*>(v))
if bothT1
andT2
are standard-layout types (3.9) and the alignment requirements ofT2
are no stricter than those ofT1
, or if either type isvoid
. Converting a prvalue of type “pointer toT1
” to the type “pointer toT2
” (whereT1
andT2
are object types and where the alignment requirements ofT2
are no stricter than those ofT1
) and back to its original type yields the original pointer value. The result of any other such pointer conversion is unspecified.
值得注意的是,稍后在标准中有一些对类派生的 C 风格模拟的支持,这显然与上面末尾的“任何其他”相矛盾:
C++11 §9.2/20,
”
A pointer to a standard-layout struct object, suitably converted using areinterpret_cast
, points to its initial member (or if that member is a bit-field, then to the unit in which it resides) and vice versa.
在这种情况下,两个对象必然具有相同的对齐方式,而前面引用的段落只讨论了类型的对齐方式——但显然形式上的小矛盾不是实际问题,正如我所看到的.
关于c++ - reinterpret_cast 什么时候修改位?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24646084/
我最近了解到 C++ 标准包含“严格的别名规则”,它禁止通过不同类型的变量引用相同的内存位置。 但是,该标准确实允许 char 类型合法地别名任何其他类型。这是否意味着 reinterpret_cas
我需要将一段代码从 C++ 转换为 VB6。 具体来说,这个: reinterpret_cast(reinterpret_cast(lParam)->hwndParent) 有人能告诉我这在 VB6
我正在编写与对齐相关的代码,如果给定的指针正确对齐,却没有标准的功能测试,这让我感到非常惊讶。 似乎互联网上的大多数代码都使用(long)ptr或 reinterpret_cast(ptr)测试对齐,
这个问题在这里已经有了答案: Why is reinterpret_cast not constexpr? (2 个答案) 关闭去年。 我遇到了以下错误: class NormalClass { p
我recently learned通过 reinterpret_casting 其地址将 POD 重新解释为不同的 POD 是未定义行为。所以我只是想知道 reinterpret_cast 的潜在用例
考虑以下程序: struct A{}; int main() { A a; A b = a; A c = reinterpret_cast(a); } 编译器 (g++14)
我recently learned通过 reinterpret_casting 其地址将 POD 重新解释为不同的 POD 是未定义行为。所以我只是想知道 reinterpret_cast 的潜在用例
它为什么会存在?在什么情况下它不会导致严格的别名违规,在哪些情况下会导致? 我的意思是,如果你在两个不兼容的类型之间进行转换,并且该转换的结果是唯一指向它在整个程序中使用的内存的指针,那么在假设没有其
这两个cast语句是一样的吗?它们产生相同的结果。 const std::int16_t i = 3; char a[ 2 ]; *reinterpret_cast(a) = i; reinterp
我已经编写了 MyString 和 MyStringConst 类。现在我需要不时地将 MyString 作为 MyStringConst 传递,因此重载强制转换运算符。这是我写的 MyString:
我有一个结构 S,它将两个类型为 T 的固定大小的数组打包在一起。 template struct S { array, 10> x1; array x2; }; 我想获取对大小为 2
如果我已将结构的成员复制到我的类中,我是否可以从我的类转换为结构? #include #include class Buffer { public: void * address;
#include struct A { int a; }; struct I1 : A { int a; }; struct I2 : A { int a; }; struct D : I1, I2
是否可以使用 reinterpret_cast 将 const 限定符仅添加到结构的一个成员。 #include std::pair test; std::pair& ctest = reinter
int main() { class_name object; object.method(); fstream file("writeobject.dat" , ios::o
当我注意到它的输出完全错误时,我正在测试一个简单的编译器。事实上,输出的字节顺序从小变大了。经过仔细检查,违规代码原来是这样的: const char *bp = reinterpret_cast(&
基本思想是创建一个可变大小的数组,在构造时固定,并在单个分配单元中创建另一个类,以减少开销并提高效率。分配缓冲区以适应数组,并使用另一个对象和新放置来构造它们。为了访问数组的元素和另一个对象,使用了指
#include struct I1 { virtual void nb1()=0; virtual ~I1(){} }; struct I2 { virtual void n
我刚刚在使用reinterpret_cast的代码中发现了一个错误,将其更改为dynamic_cast后,问题就消失了。然后,我尝试使用以下代码重现该行为: 1 #include 2 3
我想知道有没有一种不用大量复制就可以解决这个问题的好方法。 例如,假设我有一个字节缓冲区,我在其中保存了很多东西。我会正确地在其中保存 4 个字节的整数和 float 等。 现在,如果我的整数保存在缓
我是一名优秀的程序员,十分优秀!