【问题标题】:Optimal Code for initialization初始化的最佳代码
【发布时间】:2023-03-04 17:25:01
【问题描述】:

以下哪个代码最适合初始化数组?

char szCommand[2048] ={0}

char szCommand[2048];
memset(szCommand,0,2048);

【问题讨论】:

  • 只需在字符串末尾添加'\0'
  • 看到这个几乎相同的问题stackoverflow.com/q/1998752/57428
  • @maanu,您需要多少性能优势?
  • 你需要它为零吗?您可以立即为其分配 real 值吗?

标签: c++


【解决方案1】:

第二个不是初始化数组,更像是赋值给它。我认为,如果有任何明显的差异(不会有),您必须自己分析它并看到第一个版本可能会快一点——但这只是在优化关闭的情况下。 过早的优化是万恶之源——别想了

【讨论】:

    【解决方案2】:

    两个版本之间的性能差异是如此微不足道(如果编译器不优化差异),我倾向于使用最易读的版本

    【讨论】:

      【解决方案3】:

      对于以空结尾的字符串,在我看来,最佳初始化是这样的

      szCommand[0] = 0;
      

      【讨论】:

      • @ybungalobill,是的。我发布了另一种方式,OP 可能会觉得没问题。
      • 将 1 个字节与 2048 个字节设置为零之间的区别没有任何“客观”意义。如果这真的是一个字符串,一个字节就足够了。
      【解决方案4】:

      任何体面的编译器都应该为这两种情况发出相同的代码。在memset的情况下,编译器可以通过理解标准库中函数的语义来消除函数调用。

      【讨论】:

      • 但是,有些编译器将 memset 实现为内在函数,也有可能是相反的情况,编译器会将第一个代码示例替换为第二个。无论如何,在这两种情况下都必须清除内存。
      【解决方案5】:

      两者都是一样的,第一个版本是紧凑的 - 就是这样。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-11-24
        • 1970-01-01
        • 2018-03-09
        • 2010-12-30
        • 2011-12-19
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多