【问题标题】:Using sizeof instead of literal使用 sizeof 而不是文字
【发布时间】:2015-03-19 17:54:15
【问题描述】:

每当我在别人的代码中看到malloc 时,它通常会使用sizeof(short)sizeof(double) 等来帮助定义要分配的内存大小。在这两个示例中,为什么他们不直接将这些表达式替换为 28

【问题讨论】:

  • 因为类型的大小可以根据代码运行的平台而改变。该标准仅保证最小尺寸。
  • sizeof(double) == 64 这对我来说是新闻,你确定吗?
  • 为什么在 C++ 代码中使用malloc
  • @Karnivaurus newnew[] 和分别为 deletedelete[]

标签: c++ c


【解决方案1】:

它使代码更容易移植。

一般来说,有一些编译器选项允许您说明数据在结构中的对齐方式。 double 的大小可能因平台而异。 通过一致地使用数据类型,可以减少某些类型的大小不匹配错误的发生。

我认为使用变量名而不是数据类型来表示块的大小是一个更好的做法。

float Pi = 3.14f;

float *pieArray = (float *) malloc(sizeof (Pi) * 1000);

我个人更喜欢这种方法。

typedef float Pi;

Pi *piArray = new Pi[1000];

// use it

delete[] piArray;
在大多数情况下,new/delete 应该优先于 ma​​lloc/free

【讨论】:

  • 注意sizeof是一个操作符,不是一个函数,只有当操作数是一个类型名时才需要括号; sizeof Pi 也可以。
  • 但是,在这种情况下,如果您更改Pi 的类型,您仍然会遇到问题。你最好使用sizeof *pieArray。是的,您仍然可能不匹配 Pi,但从对数组执行操作的角度来看,您的状态更好。另外,不要在 C 中将 malloc 的返回值大小写
  • 是的。我一般不用担心,一直使用它们。
  • 嗯,是的,OP 似乎并不理解 C 和 C++ 之间的区别。我们应该在这里假设 C。我关于使用数组类型的观点仍然成立。没有充分的理由不这样做。
  • 我不相信清除明显的混乱是可以避免的,但他最终必须弄清楚。您也没有解释为什么 new/delete 在 C++ 中是首选。
【解决方案2】:

在 C 中编写 malloc 调用的最便携和可维护的方法是:

T *p = malloc( N * sizeof *p );

T *p;
...
p = malloc( N * sizeof *p );

其中T 是任意类型,N 是您要分配的那种类型的对象 的数量。跨平台的类型大小不统一,并且各自的语言标准仅规定非char 类型必须能够表示的值的最小范围。例如,int 必须至少代表[-32767...32767] 的范围,这意味着它必须至少 16 位宽,尽管它可能是(并且经常是)更宽的。再举一个例子,struct 类型可能在成员之间具有不同的填充量,具体取决于平台的对齐要求,因此struct foo 类型在一个平台上可能占用 24 个字节,而在另一个平台上可能占用 32 个字节。

表达式*p 的类型为T,因此sizeof *p 给出与sizeof (T) 相同的结果,即存储T 类型的对象所需的字节数。这将始终为您提供正确的字节数来存储您的对象(或对象序列),无论平台如何,并且如果您曾经更改 T(例如从 intlong),您不会不必返回并将参数更改为malloc 调用。

请注意,您不应该在 C++ 代码中使用 malloccalloc;您应该使用像vectormap 这样的标准容器来为您处理所有内存管理。如果由于某种原因标准容器不能满足您的需求,请使用new 运算符分配T 类型的单个对象,并使用new [] 分配对象数组。

【讨论】:

    【解决方案3】:

    c++ 标准不固定 double 或 short 的大小。请注意,对于双精度数,它甚至不必是 IEEE754 浮点类型。在这方面,c++ 与 Java 不同。所以硬编码大小是个坏主意。

    并在 C++ 中使用 new / new[]delete / delete[]

    【讨论】:

    • 它在哪里说的?在 [expr.sizeof] 下它只定义了charsigned charunsigned char 的大小,并表示其他基本类型的大小是实现定义的。
    • “按照标准,双精度数固定为 64 位,因此 sizeof 为 8”——嗯,我认为这两者都不是真的。浮点类型有最小精度和范围要求,但它不是固定的。此外,64 位数字可以有任何小于或等于 8 的sizeof - 因为CHAR_BIT 被定义为至少 8,但可能更多。 (另外,如果我们考虑添加填充位的能力,那么 sizeof 的结果可能会在更大的范围内变化。)
    • 在 cmets 增加兴趣时将此作为维基百科
    猜你喜欢
    • 2019-10-18
    • 2015-01-25
    • 2020-02-18
    • 1970-01-01
    • 2021-09-26
    • 2011-06-13
    • 1970-01-01
    • 1970-01-01
    • 2016-02-25
    相关资源
    最近更新 更多