gpt4 book ai didi

c - C 中的指针实现细节

转载 作者:太空狗 更新时间:2023-10-29 16:31:32 27 4
gpt4 key购买 nike

我想知道违反假设的架构 我在下面列出了。另外,我想知道对于所有架构是否有任何假设都是错误的(也就是说,如果其中任何一个完全错误)。

  • sizeof(int *) == sizeof(char *) == sizeof(void *) == sizeof(func_ptr *)
  • 无论指向的数据类型如何,给定架构的所有指针在内存中的表示都是相同的。
  • 指针在内存中的表示与与体系结构具有相同位长的整数相同。
  • 指针数据类型的乘法和除法只被编译器禁止。注意:是的,我知道这是荒谬的。我的意思是 - 是否有硬件支持来禁止这种不正确的使用?
  • 所有指针值都可以转换为单个整数。换句话说,哪些架构仍然使用段和偏移量?
  • 增加一个指针相当于增加 sizeof(the pointed data type)指向指针存储的内存地址。如 pint32*然后 p+1等于p后4个字节的内存地址.

  • 我最习惯于在连续的虚拟内存空间中使用指针。对于这种用法,我通常可以将它们视为数轴上的地址。请参阅堆栈溢出问题 Pointer comparison .

    最佳答案

    我不能给你所有这些的具体例子,但我会尽力而为。

    sizeof(int *) == sizeof(char *) == sizeof(void *) == sizeof(func_ptr *)

    我不知道任何我知道这是错误的系统,但请考虑:

    移动设备通常具有一定量的只读存储器,其中存储程序代码等。可以想象,只读值(常量变量)可以存储在只读存储器中。并且由于 ROM 地址空间可能比普通 RAM 地址空间小,因此指针大小也可能不同。同样,指向函数的指针可能具有不同的大小,因为它们可能指向加载程序的只读内存,否则无法修改(因此您的数据无法存储在其中)。

    因此,我不知道在任何平台上我观察到上述情况不成立,但我可以想象可能出现这种情况的系统。

    The in-memory representation of all pointers for a given architecture is the same regardless of the data type pointed to.



    想想成员指针与常规指针。它们没有相同的表示(或大小)。成员指针由 this 组成指针和偏移量。

    如上所述,可以想象某些 CPU 会将常量数据加载到单独的内存区域中,该区域使用单独的指针格式。

    The in-memory representation of a pointer is the same as an integer of the same bit length as the architecture.



    取决于如何定义该位长度。 :)
    int在许多 64 位平台上仍然是 32 位。但是指针是 64 位的。
    如前所述,具有分段内存模型的 CPU 将具有由一对数字组成的指针。同样,成员指针由一对数字组成。

    Multiplication and division of pointer data types are only forbidden by the compiler.



    最终,指针数据类型只存在于编译器中。 CPU 使用的不是指针,而是整数和内存地址。所以没有其他地方可以禁止对指针类型的这些操作。您不妨要求 CPU 禁止连接 C++ 字符串对象。它不能这样做,因为 C++ 字符串类型只存在于 C++ 语言中,而不存在于生成的机器代码中。

    但是,要回答您的意思,请查找 Motorola 68000 CPU。我相信他们有单独的整数和内存地址寄存器。这意味着他们可以轻松禁止此类无意义的操作。

    All pointer values can be casted to a single integer.



    你在那里很安全。 C 和 C++ 标准保证这始终是可能的,无论内存空间布局、CPU 架构和其他任何东西。具体来说,它们保证实现定义的映射。换句话说,您始终可以将指针转换为整数,然后将该整数转换回原始指针。但是 C/C++ 语言没有说明中间整数值应该是什么。这取决于单个编译器及其目标硬件。

    Incrementing a pointer is equivalent to adding sizeof(the pointed data type) to the memory address stored by the pointer.



    同样,这是有保证的。如果您从概念上考虑,指针不指向地址,而是指向对象,那么这是完全合理的。向指针添加一个显然会使其指向下一个对象。如果一个对象是 20 字节长,那么增加指针会将其移动 20 字节,以便它移动到下一个对象。

    如果一个指针只是线性地址空间中的一个内存地址,如果它基本上是一个整数,那么递增它会在地址上加 1——也就是说,它会移动到下一个字节。

    最后,正如我在对您的问题的评论中提到的,请记住,C++ 只是一种语言。它不关心它被编译到哪种架构。许多这些限制在现代 CPU 上可能看起来很模糊。但是如果你的目标是过去的 CPU 呢?如果您的目标是 future 十年的 CPU 呢?你甚至不知道它们将如何工作,所以你不能对它们做太多假设。如果您的目标是虚拟机怎么办?已经存在为 Flash 生成字节码的编译器,可以从网站上运行。如果您想将 C++ 编译为 Python 源代码怎么办?

    遵守标准中指定的规则可确保您的代码在所有这些情况下都能正常工作。

    关于c - C 中的指针实现细节,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1352500/

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