当reinterpret_cast应用于类对象时,它将返回一个LONG_PTR。它是存储在某处的临时对象指针的某种处理吗?reinterpret_cast是否存储对象指针的副本?
回答
这个问题措辞不太好。我想不出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
类型。
LONG_PTR
不是一个标准类型,reinterpret_cast <>()甚至不是一个真正的函数,但会发生编译时。
所以不,内存没有任何反应。
reinterpret_cast用于重新解释写入指针指向的位置的内存中的值作为另一类型的对象。指针指向的内存保持不变,唯一改变的是你如何解释写入的值。
此外,我想记住,通常reinterpret_cast是邪恶的,必须避免,除非没有其他选项。
$ 5.2.10/1
“的表达 的reinterpret_cast(V)的结果是将所述表达v至键入 T. 如果T是引用类型的结果 ,所述 结果是左值;否则, 结果是一个rvalue和 左值-torvalue(4.1), 阵列到指针(4.2),和 功能到指针(4.3)标准 转换被执行上的 表达诉“
所以你的问题的答案是,它取决于'v'是左值还是右值。
- 1. 存储结构对象的空指针
- 2. 指定副本指针
- 3. Segfault转换指针与reinterpret_cast
- 4. 是否存在无法创建深层副本的对象?
- 5. 哪个更好:存储对象vs存储指针?
- 6. 删除存储指向某些对象的指针的数组
- 7. C++存储指向BST节点中的对象的指针
- 8. 我是否在更改该对象的对象或副本?
- 9. 存储一个指向对象成员变量的指针
- 10. Android捆绑传递指针或对象副本
- 11. 我如何在java中创建对象的副本,而不是指针
- 12. 本地对象指针
- 13. 的本地副本价值为指针
- 14. 纯虚拟对象是否有指向vtbl的指针?
- 15. NSDictionary存储冗余对象的副本 - 如何防止?
- 16. 's'的存储大小是未知的+指针指针
- 17. 取消引用指针是否标识正在指向的对象或返回存储在其中的值?
- 18. 如何在指针数组中存储不同类的对象
- 19. MongoDB是否存储相关文档的链接或副本
- 20. 存储对父文档的引用,而不是存储文档的副本
- 21. 如何制作指针的副本
- 22. C指针结构的深层副本
- 23. 一个字符串指针的副本
- 24. 用C++指针和指针指针读取和存储序列化对象的快速方法
- 25. 指向对象表示元素的指针或指向提供的存储元素的指针?
- 26. 原始对象的C++指针和复制对象的指针
- 27. 评估指针的指针是否存在'n'值
- 28. Convert.ChangeType()是否创建对象的副本或返回原始对象的引用?
- 29. 存储和检索系统原生指针:对象^
- 30. 将共享指针存储矢量对象抛出错误?
实际上,一个LONG_PTR不是一个指针,而是一个整数类型,它足以存储pointer_。它保证'sizeof(LONG_PTR)> = sizeof(LONG)'和'sizeof(LONG_PTR)> = sizeof(void *)''。它是C99类型'intptr_t'的非标准模拟。 – 2010-08-27 04:31:09