【问题标题】:Using C++'s namespace{} sort-of like C#'s #region/#endregion使用 C++ 的命名空间{},类似于 C# 的 #region/#endregion
【发布时间】:2014-05-21 01:04:24
【问题描述】:

我从事一个在 Windows、Mac 和 Linux 上运行的 C++ 项目。因此,有一天在 Visual Studio 中处理相同部分的代码并不少见,接下来是 Xcode,接下来是 Qt Creator,等等。

最近我开始使用 namespace{} 关键字,其方式与 C# 中使用 #region/#endregion 的方式非常相似。例如:

// MyFile.cpp

namespace MyNamespace
{
  // lots of code related to one class
}

namespace MyNamespace
{
  // lots of code related to another class
}

namespace MyNamespace
{
  // lots of code related to yet another class
}

虽然这不允许我为每个区域命名,但我仍然发现能够折叠大块代码非常有帮助。我知道存在特定于 IDE 的解决方案,例如 #pragma region/#pragma endregion,但我无法找到与 C++ IDE 无关的方法。另外,我知道这些大块可以放在他们自己的文件中,但是出于这个问题的目的,请假设这不是一个选项。

我的问题是:这会在编译的二进制文件中产生任何开销吗?这样做会对性能产生负面影响或完全影响最终结果(二进制)吗?

(注意:我们在 Windows 上使用微软的编译器,在 Mac 上使用 clang,在 Linux 上使用 gcc。)

谢谢!

【问题讨论】:

  • 我的假设是没有,因为如果将这些命名空间放入它们自己的文件中,预编译的代码结果将几乎相同。这听起来合理吗?
  • 我认为 OP 意味着所有区域都在同一个文件中,在编辑器和 IDE 中使用“折叠”...

标签: c++ ide namespaces cross-platform code-generation


【解决方案1】:

您的问题的简短回答是“否”。关注长答案:

这会在编译的二进制文件中产生任何开销吗?

没有。假设您已经在使用命名空间,则影响绝对为零。如果您之前没有使用过命名空间,那么要链接的损坏标识符的大小会受到很小的影响。

这个:

void identifier() {}        
namespace longnamespace { void identifier() {} }

分别成为符号_Z10identifierv_ZN13longnamespace10identifierv。如果您有一个庞大项目,其中包含数十万个符号,它可能会影响(尽管会轻微)您的链接时间和动态链接(加载)时间。 p>

这样做会对性能产生负面影响或影响最终结果 (二进制)?

是的,至少在加载时间方面。但不是很多。 解决方案可以缓解它(谷歌的“预链接”和“预绑定”)。

【讨论】:

  • 我应该提到MyNamespace 命名空间已经在整个项目中使用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-15
  • 1970-01-01
  • 1970-01-01
  • 2013-02-22
  • 2016-02-09
  • 1970-01-01
相关资源
最近更新 更多