代码之家  ›  专栏  ›  技术社区  ›  sharptooth

在操作内存时是否需要乘以sizeof(char)?

  •  15
  • sharptooth  · 技术社区  · 15 年前

    例如,我需要为类型为的N个元素分配内存 char . 乘以 sizeof( char )

    char* buffer = malloc( N * sizeof( char ) );
    

    char* buffer = malloc( N );
    

    我完全理解这一点 sizeof 在编译过程中进行计算,然后编译器甚至可能编译出乘法运算,因此性能损失最小,很可能为零。

    我主要是问代码的清晰性和可移植性。这是乘法运算吗 必需的 烧焦 类型

    8 回复  |  直到 15 年前
        1
  •  29
  •   David Cournapeau    15 年前

    根据定义,sizeof(char)始终等于1。一个字节是C中字符的大小,不管字节中的位数是多少(普通桌面CPU上为8)。

    一个字节不是8位的典型示例是 PDP-10 以及其他类似于小型计算机的旧体系结构,具有9/36位字节。但我相信,不是2^N的字节正变得极为罕见

    此外,我认为这是更好的风格:

    char* buf1;
    double* buf2;
    
    buf1 = malloc(sizeof(*buf1) * N);
    buf2 = malloc(sizeof(*buf2) * N);
    

    因为不管指针类型是什么,它都能工作。

        2
  •  14
  •   Bastien Léonard    15 年前

    sizeof(char) 无论您执行何种类型的内存操作,都始终为1。

    sizeof(TCHAR)

        3
  •  12
  •   unwind    15 年前

    我认为这是一种 anti-pattern . 这表明程序员不太清楚他/她在做什么,这立即使代码的其余部分变得可疑。

    诚然,它不是(引用维基百科)“无效的”,但我确实发现它“远远不是最佳的”。它在运行时不需要花费任何费用,但它会在代码中塞满不必要的垃圾,同时发出有人认为有必要这样做的信号。

    另外,请注意,表达式不会作为函数调用进行解析: sizeof 这不是一个函数。你不是在调用传递魔法符号的函数 char sizeof 对于表达式,在本例中,表达式是对类型的强制转换 烧焦 ,在C中写为 (char) .

    这是完全可能的,强烈建议尽可能使用 sizeof 在其他表达式上,它将生成表达式值的大小:

    char a;
    printf("A char's size is %u\n", (unsigned int) sizeof a);
    

    这会打印出来 1 ,始终在所有符合要求的C实现上。

    名称 在一个 malloc()

    而不是

    char *str;
    
    str = malloc(N * sizeof (char));
    

    很多人会写一个N个字符容量的字符串缓冲区,我同意

    char *str;
    
    str = malloc(N * sizeof *str);
    

    或者(仅适用于字符串)省略 如上所述,但这当然更一般,适用于任何类型的指针。

        4
  •  7
  •   mnuzzo    15 年前

    虽然它不是必需的,但我认为在SIEZOF(char)中保留它是一个好的做法,因为它使代码更可读,并且避免使用神奇的数字。此外,如果代码需要在以后更改,以便将某个对象的大小转换为该对象的指针,而不是字符,那么更改代码要比仅使用“1”更容易。

        5
  •  6
  •   Matthew Murdoch    15 年前

    这是没有必要的。看见 here (例如)。

    sizeof(char) 由C标准定义为始终 1. sizeof 返回多个 每个字节的位数是不相关的(实际上是8)。

        6
  •  3
  •   clemahieu    15 年前

    另外需要记住的是,编译器静态地知道sizeof(char)的值是1,并且它还知道将一个数字乘以静态1意味着不需要进行乘法;编译器将对其进行优化。基于这些理由,不应考虑性能问题。

        7
  •  3
  •   osgx    15 年前

    1. 统计数字:2.0%的sizeof来自 char unsigned char . 本书1.2版第1033页。
    2. 第1037页。

    无关的根据定义,数字 字符类型为字节中的字节数 一

    将字节关联为始终包含 八位。在主机上 字符类型为16位,这可以 导致错误的假设,即 将sizeof应用于字符类型 将返回值2。 这些问题在别处讨论。

        8
  •  -4
  •   foobarfuzzbizz    15 年前

    使用sizeof(char)可以使代码更具可读性和可移植性。

    在x86上,我们都知道字符是1字节。但是明确地写下来有助于让你的意图更加清晰,这总是一件好事。

    另外,如果您的代码被放在其他平台上,其中一个字符不是1字节,该怎么办。如果一个字符只有4位呢?

    同意,这是不必要的,但它不会降低运行时间,而且在罕见的情况下,您需要将代码移植到不同的体系结构,这会带来回报。