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

定义的成本是多少?

  •  5
  • emenegro  · 技术社区  · 16 年前

    要定义常量,更常见和正确的方法是什么?用define定义常量的编译、链接等方面的成本是多少?这是另一种便宜的方法吗?

    7 回复  |  直到 16 年前
        1
  •  14
  •   JohnMcG    16 年前

    定义常量的最佳方法是

    const int m = 7;
    const float pi = 3.1415926f;
    const char x = 'F';
    

    使用 #define 是一个坏的C++风格。不可能藏起来 α定义 在命名空间范围内。

    比较

    #define pi 3.1415926
    

    具有

    namespace myscope {
    const float pi = 3.1415926f;
    }
    

    第二种方法显然更好。

        2
  •  5
  •   cHao    16 年前

    编译器本身从未看到定义。预处理器在将所有宏传递给编译器之前展开它们。不过,其中一个副作用是,值是重复的……两个相同的字符串不一定是完全相同的字符串。如果你说

    #define SOME_STRING "Just an example"
    

    对于编译器来说,每次看到字符串时向输出文件添加字符串副本是完全合法的。一个好的编译器可能会消除重复的文本,但这是它必须做的额外工作。如果使用常量,编译器就不必那么担心了。

        3
  •  2
  •   Terry Mahaffey    16 年前

    只有在解决了定义时,预处理器才需要付出成本(当然,忽略了处理一个满是定义常量的项目所需的额外调试成本)。

        4
  •  1
  •   Arun    16 年前

    #define 宏由预处理器处理,编译器看不到它们。由于它们对编译器来说是不可见的,所以很难调试涉及宏的东西。

    定义常量的首选方法是使用const关键字和适当的类型信息。

    const unsigned int ArraySize = 100;
    

    更好的是

    static const unsigned int ArraySize = 100;
    

    当常量仅在单个文件中使用时。

        5
  •  1
  •   Mihir Mehta    16 年前

    #define将增加编译时间,但执行速度更快…

    通常在条件编译中使用定义…

    其中const用于一般的数字计算

    选择取决于你的要求…

        6
  •  0
  •   vpit3833    16 年前

    #define 是字符串替换。因此,如果您在宏中出错,它们将在以后显示为错误。大多数不正确的类型或不正确的表达式是常见的。

    对于条件编译,预处理器宏最有效。对于用于计算的其他常数, const 工作良好。

        7
  •  0
  •   JohnMcG    16 年前

    CPU时间实际上不是使用define或宏的成本。开发商的“成本”如下:

    • 如果宏中有错误,编译器将在引用宏的位置标记它,而不是在定义宏的位置标记它。
    • 您将丢失宏的类型安全性和范围。
    • 调试工具将不知道宏的值。

    这些东西可能不会占用CPU周期,但它们可以占用开发人员周期。

    对于常量,声明 const 变量更可取,对于小类型独立的函数,内联函数和模板更可取。