在32,64位上正确存储容器大小

时间:2014-03-10 11:56:45

标签: c++ 64-bit std

我目前正在将应用程序转换为64位。 我有一些出现以下模式:

class SomeOtherClass;

class SomeClass
{
    std::vector<SomeOtherClass*> mListOfThings;

    void SomeMemberFunction (void)
    {
        // Needs to know the size of the member list variable
        unsigned int listSize = mListOfThings.size();

        // use listSize in further computations
        //...
    }
}

显然在实际情况下,我的列表中不会有更多MAX_INT项。但我想知道是否就代表这种类型的“最佳”方式达成共识。

每个集合为size()定义自己的返回类型,所以我的第一个近似值是:

std::vector<SomeOtherClass*>::size_type listSize = mListOfThings.size()

我认为这是正确的,但(个人而言)我没有发现这个“易读”,所以-1为清晰起见。

对于c ++ 011感知编译器,我可以编写

auto listSize = mListOfThings.size()

显然更具可读性。

所以我的问题是,后者确实是在变量中处理容器大小并在计算中使用它们的最佳方法,无论底层架构如何(win32,win64,linux,macosx)?

3 个答案:

答案 0 :(得分:2)

您想要使用的是您希望代码“纯粹”的问题。

如果您使用的是C ++ 11,则可以使用auto并完成。

否则,在极其通用的代码(设计用于任意分配器)中,您可以使用容器的嵌套typedef size_type。这是从容器的分配器逐字逐句。

在标准库容器的正常使用中,您可以使用std::size_t。这是默认分配器使用的size_type,并且是保证能够存储任何对象大小的类型。

我不建议使用[unsigned] int,因为它可能比64位平台上的必要小(它通常保留在32位,但这当然取决于编译器和设置)。我实际上看到生产代码失败,因为unsigned int不足以索引容器。

答案 1 :(得分:1)

这取决于为什么你需要的尺寸,以及将会是什么 在向量中。在内部,vector使用std::size_t。但 这是一个无符号类型,不适合数值。如果 你只想显示价值,或者其他什么,但是,如果 你以任何方式使用它作为数值, 无条件最终会咬你。

实际上,很多时候语义都是如此 代码确保值的数量不能超过 INT_MAX。例如,在评估金融工具时, 元素的最大数量小于20000,所以没有 需要担心溢出int。在其他情况下, 您将首先验证您的输入,以确保存在 永远不会溢出如果你不能这样做,最好的解决方案是 可能ptrdiff_t(这是你减去的类型 到迭代器)。或者,如果您使用的是非标准分配器, MyVectorType::difference_type

答案 2 :(得分:0)

不确定您是否已经考虑过此问题,但size_t出了什么问题? 它是编译器用于内置容器(即数组)大小的内容。