代码之家  ›  专栏  ›  技术社区  ›  tunnuz

C++中的sisit t和int有什么区别?

  •  138
  • tunnuz  · 技术社区  · 17 年前

    在几个C++示例中,我看到了使用 size_t 我会用一个简单的 int . 有什么区别,为什么 应该更好吗?

    5 回复  |  直到 6 年前
        1
  •  160
  •   Community Mohan Dere    5 年前

    从…起 the friendly Wikipedia :

    stdlib.h和stddef.h头文件定义了一个名为 尺寸

    尺寸的实际类型取决于平台;一个常见的错误是假定size_t与unsigned int相同,这可能导致编程错误,尤其是在64位体系结构变得更加普遍的情况下。

    还有,检查一下 Why size_t matters

        2
  •  37
  •   Axelle Ziegler    17 年前

    size_t是用于表示大小的类型(顾名思义)。它的平台(甚至可能的实现)依赖于此,应该仅用于此目的。显然,表示大小的size\u t是无符号的。许多stdlib函数,包括malloc、sizeof和各种字符串操作函数,都使用size\t作为数据类型。

    默认情况下,int是有符号的,即使它的大小也取决于平台,但在大多数现代机器上它将是固定的32位(尽管在64位体系结构上int的大小是64位,但在这些体系结构上int的长度仍然是32位)。

        3
  •  14
  •   Davislor    8 年前

    size_t 类型定义为 sizeof 操作人员在现实世界中,你会经常看到 int 定义为32位(用于向后兼容),但 在64位平台上定义为64位(因此可以声明大小超过4 GiB的数组和结构)。如果 long int 长整型 是32位,但是 long long int 指针是64位的,即LLP64。您也可能得到相反的结果,一个使用64位指令来提高速度,但使用32位指针来节省内存的程序。而且 int 签署并 尺寸

    int . 事实上,在70年代和80年代早期,这一点更为普遍:所有流行的8位微型计算机都有8位寄存器和16位地址,16位和32位之间的转换也产生了许多地址比寄存器宽的机器。我偶尔还会在这里看到关于Borland Turbo C for MS-DOS的问题,它的巨大内存模式在16位CPU上以32位存储了20位地址(但可以支持80386的32位指令集);摩托罗拉68000有一个带有32位寄存器和地址的16位ALU;IBM大型机有15位、24位或31位地址。您还可以在嵌入式系统中看到不同的ALU和地址总线大小。

    随时 尺寸 ,并尝试将非常大的文件或对象的大小或偏移量存储在 unsigned int ,则可能会溢出并导致错误。带着 ,也有可能得到一个负数。如果 int 无符号整型 更宽,程序将正确运行,但会浪费内存。

    1U < -3 ).为此,标准库定义了 ptrdiff_t 在里面 <stddef.h>

    也就是说,一种解决方法可能是对所有地址和偏移量进行边界检查 INT_MAX 0 INT_MIN

        4
  •  9
  •   graham.reeds    17 年前

        5
  •  -1
  •   ikegami Gilles Quénot    8 年前

    定义 SIZE_T 网址为: https://msdn.microsoft.com/en-us/library/cc441980.aspx https://msdn.microsoft.com/en-us/library/cc230394.aspx

    在此处粘贴所需信息:

    是一个 ULONG_PTR 表示指针可以指向的最大字节数。

    typedef ULONG_PTR SIZE_T;
    

    A. ULONG_PTR

    typedef unsigned __int3264 ULONG_PTR;