2010-08-26 53 views

回答

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); 

在这种情况下,返回不一定指的是你的程序有任何对象的指针,甚至内存,你的程序可以访问。没有为您的方便创建临时(根据您的问题)。您只是告诉编译器,从my_object的基地址开始的sizeof(LONG_PTR)字节应该包含LONG_PTR。希望my_object或其他代码已经设置它某处有用的地方,或指向NULL等可识别的哨兵值。可以把它看作是“给我参考已存储在my_object前面的LONG_PTR位,让我把它们当作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之内:任何其余的可能来自另一个变量,堆栈或者不可访问。认为“给我一个LONG_PTR旨在my_object的内存,它应该(或如果你写信给它)保存的值 - LONG_PTR通常地址(也许是一个”长“,或LONG_PTR是一个通用的指针特定的位大小?)“。

注意这些都是非常不同的。

更一般地,reinterpret_cast返回任何类型的传递用作模板参数,这可能是也可能不是你的LONG_PTR,但肯定有一个在reinterpret_cast<>什么本质上涉及到您LONG_PTR类型。

+0

实际上,一个LONG_PTR不是一个指针,而是一个整数类型,它足以存储pointer_。它保证'sizeof(LONG_PTR)> = sizeof(LONG)'和'sizeof(LONG_PTR)> = sizeof(void *)''。它是C99类型'intptr_t'的非标准模拟。 – 2010-08-27 04:31:09

0

LONG_PTR不是一个标准类型,reinterpret_cast <>()甚至不是一个真正的函数,但会发生编译时。

所以不,内存没有任何反应。

1

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

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

0

$ 5.2.10/1

“的表达 的reinterpret_cast(V)的结果是将所述表达v至键入 T. 如果T是引用类型的结果 ,所述 结果是左值;否则, 结果是一个rvalue和 左值-torvalue(4.1), 阵列到指针(4.2),和 功能到指针(4.3)标准 转换被执行上的 表达诉“

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

相关问题