相关疑难解决方法(0)

如何使Windows与Linux一样快速地编译C++?

我知道这不是一个编程问题,而是相关的.

我在一个相当大的跨平台项目上工作.在Windows上我使用VC++ 2008.在Linux上我使用gcc.项目中有大约40k个文件.在编译和链接同一个项目时,Windows比Linux慢10到40倍.我该如何解决这个问题?

单个更改增量构建在Linux上为20秒,在Windows上为> 3分钟.为什么?我甚至可以在Linux中安装'gold'链接器,并将时间缩短到7秒.

同样,git在Linux上比Windows快10到40倍.

在git的情况下,git可能不是以最佳方式使用Windows而是使用VC++?你认为微软希望让自己的开发人员尽可能高效,而更快的编译将会有很长的路要走.也许他们试图鼓励开发人员加入C#?

作为简单的测试,找到一个包含大量子文件夹的文件夹并做一个简单的操作

dir /s > c:\list.txt
Run Code Online (Sandbox Code Playgroud)

在Windows上.执行两次并在第二次运行时间,以便从缓存中运行.将文件复制到Linux并执行等效的2次运行并在第二次运行时运行.

ls -R > /tmp/list.txt
Run Code Online (Sandbox Code Playgroud)

我有2个工作站具有完全相同的规格.HP Z600s配备12gig内存,8个内核,3.0ghz.在包含~400k文件的文件夹上,Windows需要40秒,Linux需要<1秒.

我可以设置一个注册表设置来加速Windows吗?是什么赋予了?


一些与编译时间相关的略微相关的链接,不一定是i/o.

linux windows performance compilation

139
推荐指数
9
解决办法
2万
查看次数

为什么不在编译之前连接C源文件?

我来自脚本背景,C中的预处理器对我来说总是很难看.然而,当我学习编写小型C程序时,我已经接受了它.我只是真的使用预处理器来包含我为自己的函数编写的标准库和头文件.

我的问题是为什么C程序员不会跳过所有包含并简单地连接他们的C源文件然后编译它?如果将所有包含放在一个位置,则只需要定义一次所需内容,而不是在所有源文件中定义.

这是我所描述的一个例子.这里我有三个文件:

// includes.c
#include <stdio.h>
Run Code Online (Sandbox Code Playgroud)
// main.c
int main() {
    foo();
    printf("world\n");
    return 0;
}
Run Code Online (Sandbox Code Playgroud)
// foo.c
void foo() {
    printf("Hello ");
}
Run Code Online (Sandbox Code Playgroud)

通过cat *.c > to_compile.c && gcc -o myprogram to_compile.c在我的Makefile中执行某些操作,我可以减少我编写的代码量.

这意味着我不必为我创建的每个函数编写头文件(因为它们已经在主源文件中),这也意味着我不必在我创建的每个文件中包含标准库.这对我来说似乎是一个好主意!

但是我意识到C是一种非常成熟的编程语言,我想象的是比我聪明的其他人已经有了这个想法,并决定不使用它.为什么不?

c compilation c-preprocessor

74
推荐指数
8
解决办法
8598
查看次数

#include所有.cpp文件到一个编译单元?

我最近有理由使用常规的Debug和Release配置来处理一些Visual Studio C++项目,还有'Release All'和'Debug All',这是我以前从未见过的.

事实证明,项目的作者有一个ALL.cpp,其中#includes所有其他.cpp文件.*所有配置只构建一个ALL.cpp文件.它当然被排除在常规配置之外,并且常规配置不构建ALL.cpp

我只是想知道这是否是一种常见做法?它带来了什么好处?(我的第一反应是闻起来很糟糕.)

您可能会遇到哪些陷阱?我能想到的是,如果你的.cpps中有匿名命名空间,它们不再是那个cpp'私有',但现在也可以在其他cpps中看到了吗?

所有项目都构建了DLL,因此在匿名命名空间中存储数据不是一个好主意,对吧?但功能会好吗?

干杯.

c++ build-process build visual-studio

71
推荐指数
3
解决办法
2万
查看次数

为什么不将内容标记为内联?

首先,我不是在寻找一种方法来强制编译器内联每个函数的实现.

要降低误导性答案的级别,请确保您了解inline关键字的实际含义.这里有很好的描述,内联vs静态vs extern.

所以我的问题,为什么不标记每个函数定义inline?即理想情况下,唯一的编译单位是main.cpp.或者可能还有一些用于无法在头文件中定义的函数(pimpl idiom等).

这个奇怪的请求背后的理论是,它将为优化器提供最大的信息.它当然可以内联函数实现,但它也可以进行"跨模块"优化,因为只有一个模块.还有其他优点吗?

有没有人用真正的应用程序尝试过这个?性能是否提高了?减少?!?

标记所有函数定义有哪些缺点inline

  • 编译可能会更慢并且会消耗更多内存.
  • 迭代构建被破坏,每次更改后都需要重建整个应用程序.
  • 链接时间可能是天文数字

所有这些缺点仅影响开发者.运行时缺点是什么?

c++ optimization inline tradeoff

46
推荐指数
7
解决办法
6155
查看次数

减少cpp翻译单元的数量是一个好主意吗?

我发现如果有很多类,当我每个类使用一个*.h和一个*.cpp文件时,编译时间会大大增加.我已经使用预编译头和增量链接,但编译时间仍然很长(是的,我使用boost;)

所以我想出了以下技巧:

  • 将*.cpp文件定义为不可编译
  • 将*.cxx文件定义为可编译
  • 每个应用程序模块添加一个*.cxx文件,#include此模块的所有*.cpp文件.

因此,我只有8个翻译单元,而不是100多个翻译单元.编译时间缩短了4-5倍.

缺点是您必须手动包含所有*.cpp文件(但它不是真正的维护噩梦,因为如果您忘记包含链接器将提醒您的内容),并且某些VS IDE便利不适用于此方案,例如转到/转移到实施等

所以问题是,有很多cpp翻译单元真的是唯一真正的方法吗?我的伎俩是一种已知的模式,还是我错过了什么?谢谢!

c++ performance build-process module header-files

13
推荐指数
2
解决办法
1080
查看次数

使用boost库时加快编译/链接时间

我正在使用Boost Program Options,用它来编译非常小的C++代码需要相当长的时间(10秒甚至更长).在没有boost库的情况下编译代码需要1秒钟.

知道如何使用boost库来增加编译/链接时间吗?它是跨平台的,所以我需要用Mac OS X/Linux/PC编译代码.

c++ compiler-construction boost precompiled-headers

13
推荐指数
1
解决办法
7876
查看次数

有什么方法可以改善构建/编译时间?

我正在使用Visual Studio,似乎摆脱未使用的引用和使用语句可以加快我在大型项目上的构建时间.是否有其他已知的加速构建时间的方法.其他语言和构建环境怎么样?

什么是构建/编译期间的瓶颈?磁盘,CPU,内存?

什么是分布式构建的良好参考列表?

language-agnostic performance build-process build

9
推荐指数
1
解决办法
1万
查看次数

什么是Windows平台上最快的C++链接器?

显然,Visual Studio 2010中C++链接器的速度没有那么大的提升(在我们的例子中大约为25%).这意味着我们仍然处于30秒到2分钟之间的连接时间.当然有那些连接器表现更好吗?有没有人有切换到另一个链接器甚至完整工具集的经验,并且看到链接时间大幅下降?

干杯,

Sebastiaan

c++ windows linker

5
推荐指数
2
解决办法
1415
查看次数

包含C++源文件是一种批准的方法吗?

我有一个大的C++文件(SS.cpp),我决定将其拆分为较小的文件,以便我可以在不需要阿司匹林的情况下导航它.所以我创造了

SS_main.cpp
SS_screen.cpp
SS_disk.cpp
SS_web.cpp
SS_functions.cpp
Run Code Online (Sandbox Code Playgroud)

并将所有函数从最初的SS.cpp文件剪切粘贴到它们.

最后我将它们包含在原始文件中:

#include "SS_main.cpp"
#include "SS_screen.cpp" 
#include "SS_disk.cpp" 
#include "SS_web.cpp"
#include "SS_functions.cpp"
Run Code Online (Sandbox Code Playgroud)

这种情况现在仍然持续几个月,这些都是我遇到的问题:

  • 整个解决方案搜索(VS中的Shift-Ctrl-F)不会搜索包含的文件,因为它们未列为源文件.

  • 我不得不手动指出它们包含Subversion.

您是否相信当文件变得非常大时,在其他来源中包含源文件是一种可接受的解决方法?我应该说,在较小的类中拆分实现的类不是一个选项.

c++ header include visual-studio

3
推荐指数
2
解决办法
4203
查看次数

包含.cpp文件而不是.h文件以使vanilla gcc能够更多地优化我的代码是一个好主意吗?

出于运行速度原因,使用#include "randombytes.cpp"而不是randombytes.h在我的项目中(randombytes.cpp我的项目源代码目录中的文件)是一个好主意吗?看起来像这样:randombytes.cpp

#ifndef RANDOMBYTES_INCLUDED
#define RANDOMBYTES_INCLUDED

/* include native headers here */

unsigned char *fetch_random_bytes(int amount);

/* include other parts of my project here if necessary */

unsigned char *fetch_random_bytes(int amount) {
  // do stuff
}

#endif
Run Code Online (Sandbox Code Playgroud)

这对于需要彼此等的文件也适用,对吧?你能想到任何不起作用的情况,或者我不会得到优化的好处吗?

c++ gcc coding-style

3
推荐指数
1
解决办法
166
查看次数

为什么我们包含头文件而不是源文件?

我已经看到有人问过类似的问题,但它们对我的猿类大脑仍然没有意义。

这是一个例子。如果我在名为Bob.h:的头文件中声明了一个函数void PrintSomething();,在该.cpp文件中我说:void MyClass::PrintSomething(){std::cout << "Hello";}. .cpp例如Frank.cpp,我在另一个文件中看到人们,只包含Bob.h只有声明的标题(其中没有代码),而不.cpp包含代码,但是当他们调用其中的PrintSomething()函数Frank.cpp使用代码时,让我大吃一惊的是Bob.cpp并打印“你好”。如何?.cpp当我只包含一个.h没有说明“Hello”的文件时,它如何打印添加到文件中的“Hello”,它只是一个声明?我也查看了编译过程和链接过程,但它只是不坚持。

最重要的是,如果我现在在我的Frank.cpp文件中说:void MyClass::PrintSomething(){std::cout << "Bye";}并将文件包含Bob.h在我的文件中main.cpp并调用该PrintSomething()函数,它会打印“Hello”还是“Bye”?是电脑通灵还是什么?这个概念是我在 C++ 学习之旅中没有掌握的一件事。

提前致谢。

c++ visual-studio-code

3
推荐指数
1
解决办法
71
查看次数