GCC,MSVC,LLVM以及可能的其他工具链支持链接时(整个程序)优化,以允许编译单元之间的调用优化.
在编译生产软件时是否有理由不启用此选项?
我试图用SO找到答案.有许多问题列出了在c ++中构建一个只有头文件库的各种优缺点,但是我无法找到一个以可量化的术语来构建这样的库.
因此,在可量化的术语中,使用传统上分离的c ++标头和实现文件与仅标头之间有什么不同?
为简单起见,我假设不使用模板(因为它们只需要标题).
详细说明,我列出了我从文章中看到的优点和缺点.显然,有些不容易量化(例如易用性),因此无法用于量化比较.我会用可量化的方式标记那些我期望可量化的指标.
仅限标题的优点
仅限标题的缺点
您可以从较大的开源项目(比较类似大小的代码库)中使用的任何示例都非常感激.或者,如果您知道可以在仅标题版本和分离版本之间切换的项目(使用包含两者的第三个文件),那将是理想的.轶事数字也很有用,因为它们给了我一个可以获得一些洞察力的球场.
利弊来源:
提前致谢...
更新:
对于可能稍后阅读并且有兴趣获得关于链接和编译的一些背景信息的任何人,我发现这些资源很有用:
更新:(回应下面的评论)
仅仅因为答案可能不同,并不意味着测量是无用的.你必须开始测量一些点.您拥有的测量值越多,图像就越清晰.我在这个问题上要求的不是整个故事,而是对图片的一瞥.当然,如果他们想要不道德地宣传他们的偏见,任何人都可以使用数字来扭曲争论.但是,如果有人对两个选项之间的差异感到好奇并发布这些结果,我认为这些信息很有用.
没有人对这个话题感到好奇,足以衡量它吗?
我喜欢枪战项目.我们可以从删除大部分变量开始.只在一个版本的linux上使用一个版本的gcc.仅对所有基准测试使用相同的硬件.不要使用多个线程进行编译.
然后,我们可以测量:
根据我的经验,有许多代码明确使用内联函数,这需要权衡:
问题是:链接时优化(例如,在GCC中)是否呈现手动内联,例如,在C99中声明一个"内联"函数并提供一个实现,已经过时了?我们是否真的不需要考虑自己内联大多数函数?那些总是从内联中受益的函数呢,例如deg_to_rad(x)?
澄清:我不是在考虑同一个翻译单元中的函数,而是考虑逻辑上应该存在于不同翻译单元中的函数.
更新:我经常看到反对"内联",并建议过时.但是,就个人而言,我确实经常看到明确的内联函数:作为类体中定义的函数.
我可以制作仅头文件的库,例如 dll 和 lib 文件的 boost 吗?
环境:Window 10,Visual Studio 2015,Cmake
如果我写一个没有前向声明的类,为什么我需要将它分解为.h和.cpp?使用内联声明并将其全部保存在一个文件中是否有任何问题,并且只包括我需要的地方?
我想为一个返回std::pair使用的包中的函数提供一个C++接口Rcpp::interface.但是,编译器会抛出大量错误,从以下开始:
.../Rcpp/include/Rcpp/internal/Exporter.h:31:31: error: no matching
function for call to ‘std::pair<int, int>::pair(SEXPREC*&)’
Exporter( SEXP x ) : t(x){}
Run Code Online (Sandbox Code Playgroud)
这是一个简单的例子:
#include <Rcpp.h>
#include <utility>
// [[Rcpp::interfaces(cpp)]]
// [[Rcpp::export]]
std::pair<int, int> bla()
{
return std::make_pair(1,1);
}
Run Code Online (Sandbox Code Playgroud)
此示例函数的生成代码如下所示:
inline std::pair<int, int> bla() {
typedef SEXP(*Ptr_bla)();
static Ptr_bla p_bla = NULL;
if (p_bla == NULL) {
validateSignature("std::pair<int, int>(*bla)()");
p_bla = (Ptr_bla)R_GetCCallable("testinclude", "testinclude_bla");
}
RObject rcpp_result_gen;
{
RNGScope RCPP_rngScope_gen;
rcpp_result_gen = p_bla();
}
if (rcpp_result_gen.inherits("interrupted-error"))
throw Rcpp::internal::InterruptedException();
if (rcpp_result_gen.inherits("try-error"))
throw Rcpp::exception(as<std::string>(rcpp_result_gen).c_str());
return …Run Code Online (Sandbox Code Playgroud) 我在许多库中看到,其中包含两个文件,一个是.H文件,另一个是.CPP文件..h是包含函数原型的头文件,.CPP包含头文件中每个函数的实际c ++代码.
我想问一下,我可以创建一个单独的.h文件,并在其中编写所有c ++函数和类.并且在main.cpp中有必要时包含.h文件
c++ ×7
c ×2
benchmarking ×1
compilation ×1
gcc ×1
header ×1
header-only ×1
optimization ×1
performance ×1
rcpp ×1