【问题标题】:static variables slowing launch time of app静态变量减慢应用程序的启动时间
【发布时间】:2014-06-24 08:29:34
【问题描述】:

我正在制作一个 cpp 应用程序。我创建了一个包含很多静态变量的 .h 文件,例如

namespace MSG {
   static const int MSG_TYPE = 1;
   // many more here like strings, ints, chars.
}

这会减慢启动时间。

我在很多地方都使用过这些变量。

我可以做些什么来提高速度,同时减少更改代码的工作量?

不过,提高性能是当务之急。

【问题讨论】:

  • 使用单例模式..应该可以解决问题。
  • 我希望我们也有其他解决方案:)
  • 您确定这些变量会减慢启动速度吗?你是怎么检查的?
  • 如果变量是 int 它不能成为减慢应用程序的主要原因,但如果它是一个具有高过载构造函数的类[连接数据库或打开磁盘文件... ] 这可能会导致速度变慢,但在我看来,像 int 这样的基本类型永远不会减慢启动速度。
  • 使变量成为非静态变量,将定义移动到cpp文件中,并在标题中添加extern 声明

标签: c++ c static constants


【解决方案1】:

根本问题(假设这确实是 让你慢下来,这会让我感到惊讶)是你 在每个翻译单元中都有一个变量实例 包括标题。对于int,这可能不是问题, 但如果任何类型都有构造函数,它肯定可以 是。一般来说,except 对于整数常量,你可能 标题中不应包含static。 (请注意,如果 对象本身是 const,默认情况下它是静态的。)因此,对于 一个字符串,应该是:

namespace Msg
{
    extern std::string const someMessage;
};

然后在源文件中:

std::string const Msg::someMessage( "whatever" );

(当然,源文件应该包含标题。)

请注意,即使使用整数常量,您也必须小心; 如果使用不会导致右值的立即左值 转换,您将需要一个实际的数据声明。在每一个 以这种方式使用它的文件,因为每个实例都有一个 文件。

这里可能更好的解决方案是使用一个类,而不是 比命名空间:

class Msg
{
public:
    static int const msgType = 1;
    static std::string const someMessage;
    //  ...
};

这确保只有一个实际实例,但仍然 允许积分常数作为积分常数工作 表达式。 (在这里,你也需要一个单一的定义 某处的源文件。)

【讨论】:

  • 我的文件中有#ifndef。这不会阻止变量的许多实例
  • @AshishNegi 如果您说的是 #ifndef 作为包含防护,则不。它只会防止在单个翻译单元中包含多个内容。
  • 但最终的可执行文件不会只有一个变量吗?还是我错了?
  • @AshishNegi 包含守卫对翻译单元没有任何影响。当你声明一些静态的东西时,你是说每个翻译单元都有一个单独的实例。
  • 我从stackoverflow.com/questions/17848189/… 制作了一个带有标头保护的简单程序,现在我明白了......谢谢。
猜你喜欢
  • 1970-01-01
  • 2011-05-12
  • 1970-01-01
  • 1970-01-01
  • 2017-05-11
  • 2023-01-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多