gpt4 book ai didi

c++ - 将 uint8* 转换为 uint32* 是如何工作的?

转载 作者:行者123 更新时间:2023-11-30 01:49:43 25 4
gpt4 key购买 nike

有一个member function here :

uint8* CIwTexture::GetTexels() const;

例如,如果将返回值强制转换为 uint32*,强制转换是如何工作的?如果返回值只是 8 位,如何将指向 8 位数据的指针转换为 32 位?

最佳答案

指针只是以地址作为值的变量。这意味着所有指针都具有相同的大小(不要与“所有指针的数据具有相同的大小”混淆,这是不正确的)。

编译器处理指针指向的数据所需的所有信息都是从其类型推断出来的。这意味着 uint32_t 指向的数据将被视为 32 位数据,而 uint8_t 将被视为 8 位数据。

所有这些信息只保存在编译时,编译器根据它处理的指针生成机器码。这意味着从一个指针转换为另一个指针只与编译器相关,因此它知道在生成代码时如何处理数据。在运行时,没有任何变化,没有值被复制或移动。

粗略地说,您的内存布局可能如下所示: Initial memory layout

括号部分(数据的大小)是对编译器的提示,因此它可以按照程序员的意图处理数据。

当您转换为 uint32_t 时,您的内存布局大致如下所示: enter image description here

现在,您可以从中推断出一些事情:

  • 你的指针根本没有改变。它仍然指向相同的位置。
  • 你的内存布局也没有改变。您的数据仍然存在,其他内容也仍然存在。
  • 指针的数据大小确实发生了变化,但此信息仅在编译时保留,因此您的程序的内存布局根本没有真正发生变化。

最后,考虑以 32 位访问此数据的含义:

  • “其他东西”可能是您自己程序的其他部分,如果您修改该值,就会发生不好的事情。
  • “其他东西”可能根本不属于您的程序,这意味着它将侵入不属于它的内存。同样,坏事会发生。
  • 也许“其他内容”是供程序访问和修改的完全有效的数据。这应该清楚地记录在案。

关于c++ - 将 uint8* 转换为 uint32* 是如何工作的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28603243/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com