【问题标题】:Confusion about sizeof operator关于 sizeof 运算符的困惑
【发布时间】:2012-09-01 01:22:50
【问题描述】:

我在 Mac OSX Lion 上使用 C++,并创建了以下代码:

float* floatArray = new float[10];

for(int i = 0; i < 10; i++)
{
    floatArray[i] = 0.0 ;
}

std::cout<< "Test size of a float " << sizeof(floatArray[0]) << std::endl;
// The value is 4 byte which is what I would expect.

std::cout<< "Test the size of the whole array" << sizeof(floatArray) <<std::endl;
// the value is 8. I would have expected the value to be 40 bytes.

我不明白什么?

提前致谢

【问题讨论】:

  • 您使用的是 c++。如果需要动态分配的数组,为什么不使用std::vector?
  • 哎呀,这是一个错字。我只是把它放在一起作为例子。我应该像其他人一样。
  • @Grizzly 我正在处理数字浮点数据(有时由演出)。 #1 我不相信向量和浮点数组一样快。 #2 我需要索引数组(不是迭代),#3 我正在使用 C File 来编写二进制文件。 C File 比 iostream 快得多,C File 允许将浮点数组直接传递给流运算符。 #4 之前有人告诉过我,即使您可以使用 .at() 访问矢量索引,它也不正确。
  • vector 有时(非常罕见)明显变慢,但vector 可以防止很多错误,例如您问题中的错误。 vector 可以像数组一样使用[] 进行索引,您可以使用&amp;myvector[0] 将数据发送到流中。所以你所有的反驳都没有了。
  • #1 它不应该变慢(如果使用正确)。永远记住性能优化的第一条规则:永远配置文件,永远不要假设#2? #3 使用vector 或float* 无关紧要 #4 您可以使用.at() 或[] 进行索引,这并没有什么不妥之处。在vector 上使用[] 应该不会比在指针上使用它慢(至少在释放模式下,否则可能会有边界检查,但谁关心调试模式下的性能)。最重要的是vector 是连续的,因此您可以获得float*,它可以像使用&amp;vec[0] 的floatArray 一样使用。

标签: c++ arrays macos sizeof


【解决方案1】:

表达式sizeof(floatArray) 返回指针 的大小,而不是它所指向的大小。

【讨论】:

    【解决方案2】:

    在您的系统中,内存中指针的大小为 8 个字节。 Sizeof() 运算符只查看内存中该变量的大小。所以它会打印浮点指针的大小。

    您可以在此处找到更多详细信息。 How to find the 'sizeof' (a pointer pointing to an array)?

    【讨论】:

      【解决方案3】:

      将它与这个(实际上是一个数组)比较:

      float floatArray[10] = {0.0};
      std::cout<< "sizeof a float " << sizeof(floatArray[0]) << std::endl;
      std::cout<< "sizeof the whole array " << sizeof(floatArray) << std::endl;
      

      然后,如果您需要使用动态大小或分配的数组,请考虑改用 std::vector。

      【讨论】:

      • 啊!这就是区别。那是一个静态数组。我相信它从堆栈中分配它的内存。它不是一回事,但你只是指出了答案。 sizeof(static array) 将返回 40 个字节。我处理的数据太大会导致堆栈溢出。我需要我的数组来自堆。
      • @Miek:就术语而言,这只是一个“数组”。它不是静态的(它是静态的-sized);这是一个静态数组:static int arr[5]; 同理,这是一个静态浮点数:static float f;。是的,内存将在堆栈上分配,这称为自动存储持续时间。所以sizeof(anyarray) 是该数组的大小,无论是否静态。你的问题是一个动态分配的数组。它仍然是一个数组,但用于访问它的类型只是指向第一个元素的指针。 sizeof 对类型进行操作,因此会丢失大小信息。你应该使用std::vector&lt;T&gt;。
      【解决方案4】:

      您的第二个 sizeof(floatArray) 实际上是返回指针的大小,而不是数组的大小。 见here

      【讨论】:

      • 是的。我不需要数组的大小(长度),我需要知道文件写入的总字节数。还有其他方法可以获取相同的信息,但我虽然可以使用 sizeof 来获取它。
      • 明白。但是 sizeof(floatArray) 返回指针的大小(内存地址)。你可以使用: int length = 10; int totalMemory = 长度 * sizeof(float);
      • @Miek:或者你可以使用 std::vector。
      【解决方案5】:

      sizeof 运算符不知道指针指向什么和多少个元素(除非你给它一个数组,但那又不是一个指针)。所以它返回 sizeof (float *) - 因为你可能是 64 位的,所以指针的大小是 8 个字节长。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-12-16
        • 1970-01-01
        • 2013-08-17
        • 2016-12-12
        • 2013-10-19
        • 2013-08-11
        相关资源
        最近更新 更多