我们如何知道任何类型的理论上可能存在的物体的最大尺寸?

时间:2018-07-08 03:59:15

标签: c++ size-t size-type

Here is the introduction for size_t in cppref

  

std::size_t可以存储任何类型(包括数组)的理论上可能存在的对象的最大大小。

我知道确切的值取决于平台。但是,谁来决定theoretically possible object的大小,编译器或操作系统,甚至是计算机制造商?可以计算理论上可能存在的物体的大小,还是由人为规则决定?

此外,如果计算机是64位的,这是否意味着最大对象大小可能是2 ^ 64字节?

3 个答案:

答案 0 :(得分:5)

  

但是谁来决定理论上可能的物体[...]的大小?

“实现”的作者可以决定。该实现是一个相当模糊的术语,其中包括编译器,运行时库以及通常至少一部分OS。

  

此外,如果计算机是64位的,这是否意味着最大对象大小可能是2 ^ 64字节?

不是。您可能不能超过 2 64 -1个字节,但限制可能是(通常,至少在我撰写本文时,这是从2018年开始的机器电流)这个)远低于那个。当前许多CPU的实际限制都小得多-大约2 42 -1可能更现实。

答案 1 :(得分:2)

这实际上是双向的。

由于 #region AES Encryption public static async Task<bool> EncryptAesFileAsync(StorageFile fileForEncryption, string aesKey256, string iv16lenght) { bool success = false; try { //Initialize key IBuffer key = Convert.FromBase64String(aesKey256).AsBuffer(); var m_iv = Convert.FromBase64String(iv16lenght).AsBuffer(); SymmetricKeyAlgorithmProvider provider = SymmetricKeyAlgorithmProvider.OpenAlgorithm(SymmetricAlgorithmNames.AesCbcPkcs7); var m_key = provider.CreateSymmetricKey(key); //secured data IBuffer data = await FileIO.ReadBufferAsync(fileForEncryption); IBuffer SecuredData = CryptographicEngine.Encrypt(m_key, data, m_iv); await FileIO.WriteBufferAsync(fileForEncryption, SecuredData); success = true; } catch (Exception ex) { success = false; DialogHelper.DisplayMessageDebug(ex); } return success; } public static async Task<bool> DecryptAesFileAsync(StorageFile EncryptedFile, string aesKey256, string iv16lenght) { bool success = false; try { //Initialize key IBuffer key = Convert.FromBase64String(aesKey256).AsBuffer(); var m_iv = Convert.FromBase64String(iv16lenght).AsBuffer(); SymmetricKeyAlgorithmProvider provider = SymmetricKeyAlgorithmProvider.OpenAlgorithm(SymmetricAlgorithmNames.AesCbcPkcs7); var m_key = provider.CreateSymmetricKey(key); //Unsecured Data IBuffer data = await FileIO.ReadBufferAsync(EncryptedFile); IBuffer UnSecuredData = CryptographicEngine.Decrypt(m_key, data, m_iv); await FileIO.WriteBufferAsync(EncryptedFile, UnSecuredData); success = true; } catch (Exception ex) { success = false; DialogHelper.DisplayMessageDebug(ex); } return success; } #endregion size_t运算符的返回类型,因此该类型还设置对象的最大大小。为了使sizeof正常工作,不允许任何对象超过sizeof可以代表的大小。

什么都不需要编译器让您使用 all 可用内存来构建单个对象。可能存在上限,可能是size_tsize_t的类型选择的结果。

另一方面,对于当前的64位计算机,64位ptrdiff_t甚至比所需的还要大,因为您当前无法在小于100米(立方)的计算机中容纳16艾字节的RAM。 。 “理论上可能的”这么多。 :-}

答案 2 :(得分:1)

  

如果计算机是64位的,这是否意味着最大对象大小可以是2 ^ 64字节?

这里的问题是“ 64位计算机”信息不足以回答问题。这里的主要限制因素是指令集在任何给定时间可以寻址多少个顺序存储器。它由CPU架构的设计者决定。

x86具有多种执行模式:实模式(16位segmented),32位模式和64位模式。在这些模式的每一个中,最大的可顺序寻址存储器区域的大小是不同的。在实模式下,可以寻址1MB,但只能寻址64KB,因此size_t是16位。在其他模式下,可以顺序寻址整个地址范围。

64位处理器今天可以物理寻址48位无关紧要,因为它仍可以在完整的64位偏移量上运行,并且可以从理论上寻址一个64位长的对象。因此size_t的宽度仍然会有64位。

在商用处理器中,size_t的宽度通常对应于累加器寄存器的大小,因为它定义了CPU可以解决的最大可能偏移量。