仅提升计时标题与链接

Boost Chrono Header Only versus Linked

本文关键字:标题 链接      更新时间:2023-10-16

Boost Chrono 文档说可以将 chrono 库用作仅标题库。 我没有看到任何提到将其用作仅标题库的限制的内容。 除了不需要针对boost_chrono链接的明显区别之外,当我定义BOOST_CHRONO_HEADER_ONLY宏时,还有什么变化?

我对使用该库来实现chrono_io功能很有趣。 我更愿意使用仅标题版本,但想知道这样做会失去什么。 如果没有任何区别,为什么链接版本存在?

#define BOOST_CHRONO_VERSION 2
#include <boost/chrono.hpp>
#include <boost/chrono/chrono_io.hpp>
int main(int argc, char **argv)
{
const auto now = boost::chrono::system_clock::now();
std::cout << "It is now " 
<< boost::chrono::time_fmt(boost::chrono::timezone::local) 
<< now << "n";
}

编译方式

g++ -std=c++11 -o chronoLinked main.cpp -lboost_system -lboost_chrono
g++ -std=c++11 -o chrono main.cpp -lboost_system -D BOOST_CHRONO_HEADER_ONLY

运行两者会产生与当前时间相同的输出。

如果没有记录的差异,您可以确信没有差异。

当然,技术上的区别在于二进制文件会更大(包含共享库中所有必需的定义(。

对于其他库(如 Boost System(,选择仅标头变体影响程序,例如链接到也使用 Boost System 的其他库。区别在于在动态链接场景中共享全局变量时会复制全局变量。一个明显的例子是错误类别。

如果您想保持警惕,请寻找需要共享而不是重复的(静态(全局数据。我并没有立即意识到Boost Chrono中的此类数据。