【问题标题】:The operation of the sizeof operator in C++C++中sizeof运算符的操作
【发布时间】:2016-03-15 06:53:27
【问题描述】:

在我的 MS VS 2015 编译器上,sizeof int 是 4(字节)。但是sizeofvector<int>是16。据我所知,一个vector在它还没有初始化的时候就像一个空盒子,那为什么它是16呢?为什么是 16 而不是其他数字?

此外,如果我们有vector<int> v(25);,然后用整数初始化它,那么v 的大小仍然是16,尽管它有25 个int 数字!每个 int 的大小是 4,所以 sizeof v 看起来应该是 25*4 字节,但实际上它仍然是 16!为什么?

【问题讨论】:

  • 你能检查int * 变量的大小吗?我认为 16 是您机器中的指针大小
  • sizeof (int*) 是 4。
  • 类型的大小不会随其内容而变化,这是一个基本的 C++ 规则。例如:char *j = "hello": char *k = "goodbye";。由于jk 都是char * 类型,因此它们占用的字节数相同。他们可以用来访问的东西的大小无关紧要。
  • 我建议你编写自己的'vector'类以便更好地理解。从非模板开始,然后模板化您的矢量类。你会得到扎实的理解!
  • @niyasc 实现std::vector 至少需要3 个指针大小的对象(或者实际上是一个指针和两个std::size_t 大小的对象)。在 32 位系统上,具有 4 字节指针并允许对齐,对于 std::vector,16 是合理的大小。

标签: c++ vector sizeof


【解决方案1】:

每个 int 的大小是 4,所以 v 的大小看起来应该是 25*4 字节,但实际上它仍然是 16!为什么?

您混淆了sizeof(std::vector)std::vector::size(),前者将返回向量本身的大小,不包括它所包含的元素的大小。后者将返回元素的数量,您可以通过std::vector::size() * sizeof(int) 获取它们的所有大小。

那为什么是 16?为什么是 16 而不是其他数字?

sizeof(std::vector) 是什么取决于实现,主要是implemented with three pointers。在某些情况下(例如调试模式),为方便起见,大小可能会增加。

【讨论】:

    【解决方案2】:

    std::vector 通常是一个包含两个元素的结构:其元素的指针(数组)和数组的大小(元素数)。

    由于sizesizeof(void *),指针也是sizeof(void *),所以结构的大小是2*sizeof(void *),即16

    元素的数量与大小无关,因为元素是在堆上分配的。

    编辑:正如 M.M 所提到的,实现可能会有所不同,例如指针 startendallocatedSize。所以在 32 位环境中应该是3*sizeof(size_t)+sizeof(void *),这里可能就是这种情况。即使是原始版本也可以使用硬编码为 0 的start 和通过屏蔽end 计算的allocatedSize,因此真正依赖于实现。但重点还是一样。

    【讨论】:

    • 该向量至少需要 3 个数字或指针(开始、结束、容量),因此 16 的大小可能表示 3 个 4 字节指针加上一些簿记
    • 我认为您误解了@MM 所说的内容。您需要三个信息来满足std::vector 规范。您需要 begin()end()size()capacity() 都为 O(1)。
    • @juanchopanza :它们仍然是 - 如果start 被硬编码为索引0sizeend 将是相同的。而capacity 将被计算为(size&(size-1))<<1。除了从一开始删除元素的操作之外,性能几乎相同。即使使用 4 字段实现 startend 最好是整数 (size_t),因为它们不需要在每次重新分配后进行调整。但正如我所说 - 它确实可能因实施而异。
    【解决方案3】:

    sizeof 在编译时计算,因此它只计算类中声明的变量的大小,其中可能包括几个计数器和一个指针。指针指向的内容随大小而变化,但编译器不知道这一点。

    【讨论】:

      【解决方案4】:

      可以使用指针来解释大小,这些指针可以是:1)向量的开头 2)向量的结尾和 3)向量的容量。所以它更像是依赖于实现,并且会随着不同的实现而改变。

      【讨论】:

        【解决方案5】:

        您似乎将“数组”与“向量”混合在一起。如果您有一个本地数组, sizeof 将确实提供数组的大小。但是,vector 不是数组。它是一个类,一个来自 STL 的容器,保证内存内容位于单个内存块中(如果向量增长,它可能会被重新定位)。

        现在,如果您查看 std::vector 实现,您会注意到它包含字段(至少在 MSVC 14.0 中):

         size_type _Count = 0;
         typename _Alloc_types::_Alty _Alval;   // allocator object (from base)
         _Mylast
         _Myfirst
        

        在您的实现下,这可能总计 16 个字节(注意:经验可能会有所不同)。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2016-03-29
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-12-30
          • 1970-01-01
          • 1970-01-01
          • 2018-03-30
          相关资源
          最近更新 更多