Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ssl/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ “什么是”呢;目标平台上最大可能对象的大小“;在尺寸方面_C++_C_Cpu_Size T_Size Type - Fatal编程技术网

C++ “什么是”呢;目标平台上最大可能对象的大小“;在尺寸方面

C++ “什么是”呢;目标平台上最大可能对象的大小“;在尺寸方面,c++,c,cpu,size-t,size-type,C++,C,Cpu,Size T,Size Type,我正在读一篇关于C/C++中的size\u t(通过Stackoverflow找到链接)的文章 文章引述: Type size_t是一个typedef,它是某个无符号整数的别名 类型,通常为无符号int或无符号long,但可能为偶数 未签名的long-long。每个标准C实现都应该 选择足够大但不大于的无符号整数 需要--来表示屏幕上最大可能对象的大小 目标平台。 如何确定机器上最大可能对象的大小 什么会影响最大对象的大小(处理器除外) 欢迎链接详细解释。编译器向您提供“最大可能对象的大小”信息

我正在读一篇关于C/C++中的
size\u t
(通过Stackoverflow找到链接)的文章

文章引述:

Type size_t是一个typedef,它是某个无符号整数的别名 类型,通常为无符号int或无符号long,但可能为偶数 未签名的long-long。每个标准C实现都应该 选择足够大但不大于的无符号整数 需要--来表示屏幕上最大可能对象的大小 目标平台。

如何确定机器上最大可能对象的大小

什么会影响最大对象的大小(处理器除外)


欢迎链接详细解释。

编译器向您提供“最大可能对象的大小”信息是没有意义的,因为它取决于您的程序的其他功能。在32位体系结构上,一个对象的大小可以限制为231-1字节,以避免签名类型
ptrdiff_t
的溢出问题,或者实现者可能已经选择不设置这样的任意限制,在这种情况下,一个对象可以拥有的大小取决于为堆栈保留多少虚拟空间,对于文件范围变量,操作系统的策略是什么……没有一个确切的“最大对象的大小”,除非您指的是一个明显的上限,例如虚拟地址空间的大小


类型
size\u t
保证能够表示在最佳情况下可以分配的最大对象的大小:小代码、最小堆栈、无地址空间随机化浪费、无其他变量。例如,我希望某些64位内核(在x86-64体系结构上)可以将整个4GB虚拟地址空间留给32位进程,例如由大小为_MAX=232-1的32位编译器生成的程序,在这种情况下,对象可能在理论限制的几兆字节内。我在实践中观察到的最大值是2.5GIB,对于32位<代码> SiZeIt 。

< P>编辑:我认为重要的是,这种类型并不严格意味着你可以有一个大小的对象——只是它是一个大到足以容纳最大可能对象的大小的整数,这并不意味着你可以使用。
SIZE\u MAX
分配内存。它只保证最大的可能对象不能大于
SIZE\u MAX

这是编译器实现的体系结构决策(通常反过来基于编译器所针对的操作系统,但操作系统可能提供比编译器更多的功能,或者编译器可能支持的理论数量超过操作系统允许的数量,只是当您要求时,它将失败)

实际上,几乎总是由处理器决定此大小-
size\t
几乎总是与处理器的位匹配-例如,在32位处理器中为32位,在64位处理器中为64位。但是设计一个64位处理器上32位的系统是可能的——一个“对象”不能大于4GB,这不是一个很大的限制,真的。这只是意味着不能使用一个
int
向量来填充超过4GB的数据,因此
向量中的条目数不能超过1G(或4G
char
条目)

当然,另一个限制因素是可用内存——如果你有一台非常旧的机器,有256MB的RAM,它将不允许你分配4GB,即使
size\t
允许。但是给同一台机器更多的内存,你就可以使用更大的尺寸

在许多32位系统上,应用程序允许的最大内存小于4GB(整个32位范围),因为部分内存“保留”用于其他用途。同样地,
大小\u t
是32位的,因此允许4GB,但它实际上不支持单个应用程序使用的全部内存量-另一方面,32位机器可能有超过4GB的RAM,并在多个应用程序之间分配


此外,如果系统受到限制(出于某些架构原因),例如,内存限制为16MB,
size\u t
很可能仍然是一个32位无符号整数-因为大多数处理器不做24位整数[一些DSP可以做,但常规的16或32位处理器不做]

处理器不会直接影响这一点,只是说它的体系结构会限制理论上可以解决的问题。但是,在您的机器上实际可以寻址的内容将由您的总可用连续内存决定。@paddy:我在一个地址空间中有一个嵌入式系统16k片上SRAM,在另一个地址空间中有2Mb SRAM(与片上内存不连续),在另一个地址空间中有128k的MRAM。那么,我的总连续内存是多少?即使它不是连续的,也能解决所有问题吗?我在另一个内存地址空间中也有闪存,更不用说在另一个地址空间中的FPGA寄存器了。这与16位进程的24位地址空间相比如何(一个Intel芯片可以做到这一点)?size-t是24位还是16位还是32位?旧的DOS使用20位地址空间。OS/2 1.x使用了24位地址空间。是的,在“大”模式下会有一个32位的
size\u t
。在“小”模式下,
size\u t
将为16位。