为什么sizeof适用于返回类型

时间:2013-05-10 14:31:01

标签: c++ sizeof

我找不到有关sizeof行为的信息(至少在gcc 4.6+中)。以下代码工作并产生“预期”结果(4,1,8),但我想知道为什么。我检查了几个问题但没有显示像这样的例子。

#include<iostream>

int f1(int) {
  return 0;
}

char f2(char) {
  return 0;
}

double f3() {
  return 0;
}

int main() {
  std::cout << sizeof(f1(0)) << std::endl;
  std::cout << sizeof(f2('0')) << std::endl;
  std::cout << sizeof(f3()) << std::endl;

  return 0;
}

非常感谢答案。 感谢。

4 个答案:

答案 0 :(得分:4)

sizeof运算符可以将类型或表达式作为参数,并返回其参数的大小。您正在使用表达式,因此它返回这些表达式的大小。表达式不在运行时计算 - 因此永远不会调用函数。但正确(重载)函数用于确定结果的大小。

在(现已删除的)评论中,user1919074说:

  

sizeof(f1)不起作用

脑屁

在C中,sizeof(f1)将起作用,因为它将返回指向函数的指针的大小。

sizeof()运算符不能直接应用于函数名称。它有特殊的规则,当应用于数组时,不会发生指针的正常“衰减”。同样,函数名称更改为函数指针不会发生sizeof()。 (当然,你必须用-pedantic来强制攻击GCC以使其发出警告/错误;否则,它将返回1作为函数的大小。)

答案 1 :(得分:2)

功能中发生了什么

int f1(int) {
  return int(0);
}

char f1(char) {
  return char(0);
}

double f1() {
  return double(0);
}

后来发生了什么。

std::cout << sizeof(int(0)) << std::endl;
std::cout << sizeof(char('0')) << std::endl;
std::cout << sizeof(double(0)) << std::endl;

因为您要从函数

打印sizeof 返回value

答案 2 :(得分:1)

关于C ++的

ISO/IEC 14882说(第5.3.3节 - 第79页): 说

  

“size运算符不应用于具有的表达式   功能或不完整的类型,......“

还要注意启用了-pedantic选项的编译警告...

warning: invalid application of 'sizeof' to a function type

答案 3 :(得分:0)

f1返回一个占4个字节的整数 f2返回一个占用1个字节的字符 f3返回一个需要8个字节的double。

所以sizeof()所做的就是返回其参数的大小。