reinterpret_cast是否存储了对象指针的副本?

时间:2010-08-26 12:00:05

标签: c++

当reinterpret_cast应用于类对象时,它返回LONG_PTR。它是存储在内存中某处的临时对象指针的某种句柄吗?

4 个答案:

答案 0 :(得分:2)

这个问题措辞不太好。我想不出reinterpret_cast<LONG_PTR>(object)可以使用的任何方式的对象,假设LONG_PTR是某种指针类型(它不是标准C ++),而object是一个类实例(C ++标准考虑了变量内置类型也是对象 - 可以工作。)

您可能会想到:

My_Class my_object;

// convert an arbitrary value to a pointer
reintrepret_cast<LONG_PTR>(1234)

在这种情况下,1234永远不是运行时“对象” - 甚至不是内存中的临时int - 它只是编译器转换为LONG_PTR的数字,就好像你是使用static_cast<>。您可以将此视为“给我LONG_PTR这个值”。

您可以重新解释为引用对象:

// get a LONG_PTR extracted from memory [&my_object...&my_object+1)
reintrepret_cast<LONG_PTR&>(my_object);

在这种情况下,返回的指针不一定是指程序所拥有的任何对象,甚至不是指程序可以访问的内存。为方便起见,没有临时创建(根据您的问题)。您只是告诉编译器从sizeof(LONG_PTR)的基址开始的my_object字节应该包含LONG_PTR。希望my_object或其他代码设置它以某种方式指向某个有用的地方,或者设置为可识别的哨兵值,如NULL。将此视为“给我一个已存储在LONG_PTR前面的my_object位的引用,让我将它们视为LONG_PTR并忘记关于my_object的所有内容” - 你最好希望这些位/字节以你的CPU可以处理的方式在内存中对齐,或者你可以得到SIGBUS或等价的。

您还可以将指向对象的指针重新解释为LONG_PTR

// get LONG_PTR that points at my_object's base address
reintrepret_cast<LONG_PTR*>(&my_object);

在这种情况下,您知道返回的值确实指向程序中的某个位置,指向有效内存,但如果sizeof(LONG_PTR)大于sizeof(my_object),则其所有内存都不在my_object内。 1}}:任何余数都可以来自另一个变量,堆栈,或者再次是不可访问的。想一想“给我LONG_PTR针对my_object的记忆,这应该(或者如果你写的话)保留 - LONG_PTR正常地址(也许是” LONG“,或者LONG_PTR是特定位大小的通用指针?)”。

请注意,这些都非常不同。

更一般地说,reinterpret_cast会返回您作为模板参数传递的任何类型,这可能是您的LONG_PTR,也可能不是reinterpret_cast<>,但LONG_PTR中与您的{{1}}相关的肯定没有任何内容{1}}输入。

答案 1 :(得分:1)

reinterpret_cast用于将指向指针的位置内存中写入的值重新解释为另一种类型的对象。指针指向的内存保持不变,唯一改变的是你如何解释写入的值。

另外,我想要记住,通常reinterpret_cast是邪恶的,必须避免,除非真的没有其他选择。

答案 2 :(得分:0)

LONG_PTR不是标准类型,reinterpret_cast&lt;&gt;()甚至不是真正的函数,而是编译时间。

所以不,内存中没有任何事情发生。

答案 3 :(得分:0)

$ 5.2.10 / 1

  

“表达的结果   reinterpret_cast(v)就是结果   将表达式v转换为type   T. 如果T是参考类型,则   结果是左值;否则,   结果是右值和   lvalue-torvalue(4.1),   数组到指针(4.2),和   函数到指针(4.3)标准   转换是在   表达v。“

所以问题的答案是,它取决于'v'是左值还是'右值。