【问题标题】:Speed : typedef vs #define in c++速度:C++ 中的 typedef 与 #define
【发布时间】:2020-05-01 18:37:30
【问题描述】:

最近我遇到了typedefs 和#defines。尽管它们的用法相似,但其中一个是编译器令牌,另一个是预处理器令牌。

这让我想知道它们的运行速度,因为人们希望在竞争性编程中尽可能快。

那么,哪一个相对更快?附有答案的解释会很棒。使用的编译器会像g++ vs MSVC compiler vs clang 编译器有什么不同吗?

用例示例: typedef long long int;#define ll long long int

【问题讨论】:

  • 完全没有区别。运行代码时,类型和预处理器都不存在。
  • 速度在什么意义上?编译时间?它们可能在编译时间上有所不同,但肯定是微不足道的。没有其他区别。宏 (#define) 往往会破坏代码,因此不受欢迎。
  • 您陷入了过早的优化。在设计合理的问题中,无论您如何优化常数因子,慢速算法都不会及时运行,而快速算法将很容易及时运行,而无需优化每一位。像这样的东西在竞争性编程中很少有关系。
  • 请不要滥用typedef 使您的代码不可读。将变量和类型名称缩短到最低限度不会 使您的代码运行得更快,只会使其更难阅读和理解。如果您需要询问您的“竞争性”代码,此处不会很好地接收此类缩写。
  • 对所有变量使用 long long int 比选择将名称缩短为 ll 的影响更大。

标签: c++ g++ clang


【解决方案1】:

性能没有差异,但不推荐使用预处理器宏,因为它们会污染全局范围,因为与 typedef 不同,它们不能放在命名空间中。

但可以说,ll 表达能力不是很强;它可能会降低代码的可读性。考虑使用<cstdint> 中的int64_t。很好,因为它更具表现力(_t 清楚地表明它是一个类型,并且它的大小正好是 64 位,因此是面向未来的,即使 long long 是 128 位也是如此),并且相对简洁,所以不需要 @987654328 @任何东西。

【讨论】:

  • 宏是预处理、基于文本的,它们最终不会出现在全局命名空间中,因此不会参与查找
【解决方案2】:

它们都花费相同的时间。您根本不会注意到任何差异。

还要注意,如果使用得当,它们在运行时是相同的。只有在编译时它们可能会略有不同,但这几乎没有什么。

【讨论】:

    【解决方案3】:

    如果您关心使用 c++ 功能,更好的选择是使用 using 关键字,该关键字自 c++11 起可用并专门为此目的而设计。它还与模板兼容。

    请注意,usingtypedef 在语义上是相同的。

    https://en.cppreference.com/w/cpp/language/type_alias

    【讨论】:

      【解决方案4】:

      执行时间没有差异,所以你应该可以使用其中任何一个来进行竞争性编程。

      我个人避免使用#define 并使用typedef 来表示类型,因为它更清晰易读。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-12-12
        • 2017-04-23
        • 2011-05-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-03-23
        相关资源
        最近更新 更多