sizeof-函数还是宏?
sizeof- function or macro?
在 c 中,我们使用 sizeof()
来获取数据类型的大小。所以
它是如何定义的。它是一个宏或一个函数。
因为我们可以用两种方式,
sizeof int
和
sizeof(int)
所以这是如何在头文件中定义的。
Sizeof 既不是宏也不是 function.Its 在编译时计算的运算符。
在 pr 处理阶段评估的宏。
正如@Yu Hao 所指出的,变长数组是唯一的例外。
为了更好地理解解决这个问题;
#include<stdio.h>
char func(char x)
{
x++;
return x;
}
int main()
{
printf("%zu", sizeof(func(3)));
return 0;
}
A) 1 B)2 C)3 D)4
语法
- 大小(类型)
- 列出 sizeof 表达式
两个版本 return 类型常量 std::size_t。
说明
- returns 类型对象表示的字节大小。
- returns 类型对象表示的字节大小,即
如果计算,将被 return 表达式编辑。
来自ISO/IEC9899
6.5.3.4 The sizeof operator
Constraints
1 The sizeof operator shall not be applied to an expression that has function type or an
incomplete type, to the parenthesized name of such a type, or to an expression that
designates a bit-field member.
所以它既不是宏也不是function.Its运算符!
它的处理方式是编译器的事情。
但关于编译时间和运行时间的确定标准说:
Semantics
2 The sizeof operator yields the size (in bytes) of its operand, which may be an
expression or the parenthesized name of a type. The size is determined from the type of
the operand. The result is an integer. If the type of the operand is a variable length array
type, the operand is evaluated; otherwise, the operand is not evaluated and the result is an
integer constant.
所以标准甚至规定必须在编译时确定,VLA 情况除外。
一元运算符 sizeof 用于计算任何数据类型的大小,以表示该类型所需的字节数来衡量。
在许多程序中,有些情况下了解特定数据类型的大小很有用(最常见的示例之一是使用库函数 malloc 进行动态内存分配)。尽管对于任何给定的 C 或 C++ 实现,特定数据类型的大小是恒定的,但 C 和 C++ 中甚至原始类型的大小也是实现定义的(即,标准没有精确定义)。当尝试分配适当大小的内存块时,这可能会导致问题。例如,假设一个程序员想要分配一块足够大的内存来容纳十个 int 类型的变量。因为我们假设的程序员不知道 int 类型的确切大小,所以程序员不知道向 malloc 请求多少字节。因此,需要使用sizeof:
两者都不是。它是一个内置运算符,其值是在编译时计算的,除非参数是可变长度数组的名称(在 C99 中添加)。
您经常看到的括号是 不是 "call" 的 部分,因为 sizeof
不是函数。它们是 参数 的一部分,仅当参数是强制转换表达式时才需要,即括在括号中的类型的名称。
我个人建议 against 尽可能使用 sizeof
和类型名称作为参数,因为通常不需要它,并创建一个 disconnect/de-coupling可能会导致错误。
考虑这样的事情:
float *vector = malloc(100 * sizeof(double));
上面当然有一个bug:如果float
小于double
,会浪费很多内存。如果 vector
最初是 double
的数组但后来更改为 float
,那么很容易想象得到类似上面的结果。为了防止这种情况,我总是写:
float *vector = malloc(10 * sizeof *vector);
上面使用参数*vector
(类型float
的表达式)到sizeof
,这是不是类型名称所以不需要括号。它还"locks"元素的大小到用来保存它的指针,这样更安全。
在 c 中,我们使用 sizeof()
来获取数据类型的大小。所以
它是如何定义的。它是一个宏或一个函数。
因为我们可以用两种方式,
sizeof int
和
sizeof(int)
所以这是如何在头文件中定义的。
Sizeof 既不是宏也不是 function.Its 在编译时计算的运算符。
在 pr 处理阶段评估的宏。
正如@Yu Hao 所指出的,变长数组是唯一的例外。
为了更好地理解解决这个问题;
#include<stdio.h>
char func(char x)
{
x++;
return x;
}
int main()
{
printf("%zu", sizeof(func(3)));
return 0;
}
A) 1 B)2 C)3 D)4
语法
- 大小(类型)
- 列出 sizeof 表达式
两个版本 return 类型常量 std::size_t。
说明
- returns 类型对象表示的字节大小。
- returns 类型对象表示的字节大小,即 如果计算,将被 return 表达式编辑。
来自ISO/IEC9899
6.5.3.4 The sizeof operator
Constraints
1 The sizeof operator shall not be applied to an expression that has function type or an incomplete type, to the parenthesized name of such a type, or to an expression that designates a bit-field member.
所以它既不是宏也不是function.Its运算符!
它的处理方式是编译器的事情。
但关于编译时间和运行时间的确定标准说:
Semantics
2 The sizeof operator yields the size (in bytes) of its operand, which may be an expression or the parenthesized name of a type. The size is determined from the type of the operand. The result is an integer. If the type of the operand is a variable length array type, the operand is evaluated; otherwise, the operand is not evaluated and the result is an integer constant.
所以标准甚至规定必须在编译时确定,VLA 情况除外。
一元运算符 sizeof 用于计算任何数据类型的大小,以表示该类型所需的字节数来衡量。
在许多程序中,有些情况下了解特定数据类型的大小很有用(最常见的示例之一是使用库函数 malloc 进行动态内存分配)。尽管对于任何给定的 C 或 C++ 实现,特定数据类型的大小是恒定的,但 C 和 C++ 中甚至原始类型的大小也是实现定义的(即,标准没有精确定义)。当尝试分配适当大小的内存块时,这可能会导致问题。例如,假设一个程序员想要分配一块足够大的内存来容纳十个 int 类型的变量。因为我们假设的程序员不知道 int 类型的确切大小,所以程序员不知道向 malloc 请求多少字节。因此,需要使用sizeof:
两者都不是。它是一个内置运算符,其值是在编译时计算的,除非参数是可变长度数组的名称(在 C99 中添加)。
您经常看到的括号是 不是 "call" 的 部分,因为 sizeof
不是函数。它们是 参数 的一部分,仅当参数是强制转换表达式时才需要,即括在括号中的类型的名称。
我个人建议 against 尽可能使用 sizeof
和类型名称作为参数,因为通常不需要它,并创建一个 disconnect/de-coupling可能会导致错误。
考虑这样的事情:
float *vector = malloc(100 * sizeof(double));
上面当然有一个bug:如果float
小于double
,会浪费很多内存。如果 vector
最初是 double
的数组但后来更改为 float
,那么很容易想象得到类似上面的结果。为了防止这种情况,我总是写:
float *vector = malloc(10 * sizeof *vector);
上面使用参数*vector
(类型float
的表达式)到sizeof
,这是不是类型名称所以不需要括号。它还"locks"元素的大小到用来保存它的指针,这样更安全。