【问题标题】:about power of sizeof operator in C++关于 C++ 中 sizeof 运算符的能力
【发布时间】:2011-07-04 20:00:50
【问题描述】:

我正在阅读现代 C++ 设计。关于 sizeof 运算符的描述如下所述。以下段落是从通用编程的角度解释的。

sizeof 的强大功能令人惊讶:您可以将 sizeof 应用于任何表达式,无论其复杂程度如何,并且 sizeof 无需在运行时实际评估该表达式即可返回其大小。这意味着 sizeof 知道重载、模板实例化、转换规则——所有可以参与 C++ 表达式的东西。事实上,sizeof 隐藏了一个推断表达式类型的完整工具。最终,sizeof 会丢弃表达式并仅返回其结果的大小。

我的问题是作者的意思是 sizeof 返回它的大小而没有在运行时实际评估表达式。在最后一行中还提到 sizeof 丢弃了表达式。请求帮助理解这些陈述,最好是通过示例来完成。

谢谢

【问题讨论】:

  • 想想i++ 或表达式中的函数/方法调用; sizeof 显然不会在遵循类型以报告结果大小时执行这些操作。我从来不知道 C++ sizeof 如此强大 :) 谢谢!
  • 我想这就是为什么decltype 是第一个可用的 C++0x 之一,因为无论如何这些机制已经可用:)

标签: c++ sizeof


【解决方案1】:

作者的意思是什么 sizeof 返回它的大小而没有在运行时实际评估表达式。

这意味着sizeof(1/0) 将产生sizeof(int),即使1/0 通常会中止程序,因为除以零是运行时错误。此外,对于任何声明为T* ppsizeof(*p) 将产生sizeof(T),无论p 中存储什么值,即使p 悬空或根本没有初始化。

【讨论】:

    【解决方案2】:

    sizeof编译时计算:编译器计算sizeof 运算符后面的表达式类型。这是由编译器一劳永逸完成的,因此句子“在运行时没有实际评估该表达式”

    编译器计算类型,然后它能够​​从类型推断出表达式的大小,然后,仍然在编译时,整个@987654323 @ 表达式被计算的大小替换。所以表达式本身并没有使其成为可执行代码。这就是 “sizeof 抛弃表达式,只返回其结果的大小” 这句话的意思。

    【讨论】:

      【解决方案3】:

      以下为您提供i++ 具有的类型的 sizeof,即int(通常一个 int 有 4 或 8 个字节,因此它可能会给您 4 或 8 的值)。但是,由于不计算表达式,因此不会对表达式执行运行时操作。

      int i = 0;
      sizeof(i++);
      

      评估一个表达式基本上意味着执行它的副作用(例如增加一个变量)或在运行时从内存或寄存器中读取值。所以从某种意义上说,sizeof“丢弃”了它的操作数,因为它并没有真正执行它指定的运行时操作(i 的值仍然为零)。

      【讨论】:

        【解决方案4】:

        编译器需要为各种操作计算类型/结构/类的大小。 sizeof 运算符使您的程序可以使用这些大小作为常量。因此,例如,如果您执行sizeof(int),编译器知道int 有多大(以字节为单位)并将插入该值。这同样适用于更复杂的事物,例如 sizeof(myVariable)myVariable 类型为 MyClass:编译器确实知道 MyClass 占用了多少空间,因此可以插入该值。

        关键是这个评估发生在编译时:结果是一个数字。在运行时,不需要再次进行评估。

        【讨论】:

          【解决方案5】:

          这意味着int j=sizeof(int); 将被编译为int j=4;

          我已经阅读了编译好的程序集,执行过程中实际上并没有计算!

          【讨论】:

          • 这是错误的,至少部分错误。 sizeof(int) 并不总是 4,它是平台相关的;此外,结果不应分配给int,而应分配给size_t 变量。
          猜你喜欢
          • 1970-01-01
          • 2013-10-19
          • 1970-01-01
          • 2016-03-29
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-12-30
          • 1970-01-01
          相关资源
          最近更新 更多