我有以下两个文件: -
single.cpp: -
#include <iostream>
#include <stdlib.h>
using namespace std;
unsigned long a=0;
class A {
public:
virtual int f() __attribute__ ((noinline)) { return a; }
};
class B : public A {
public:
virtual int f() __attribute__ ((noinline)) { return a; }
void g() __attribute__ ((noinline)) { return; }
};
int main() {
cin>>a;
A* obj;
if (a>3)
obj = new B();
else
obj = new A();
unsigned long result=0;
for (int i=0; i<65535; i++) {
for (int …
Run Code Online (Sandbox Code Playgroud) 我有大约50个不同的静态库链接到我的c ++项目,链接平均需要70s.
我发现这次移动了库的链接顺序.这是预期的,我想如果链接器不必在它构建到该点的整个符号表中继续搜索一组符号.
我想我可以用"nm"来获取静态库之间的依赖图.但是,这只会给我一个"正确"的链接顺序.获得最快链接顺序所涉及的因素是什么?
我觉得它会与上面提到的依赖图有关,通过尝试最小化一些数量的遍历,但我真的不确定哪个.
任何帮助,将不胜感激.
我主要使用intel编译器和gcc编译器.当我用top检查时,它们似乎都在使用GNU ld链接器.希望这可以帮助...
所以,为了更清楚地说明我想要问的内容,我已经知道如何从一组静态库中获得1遍顺序.我自己编写了这个脚本,但正如Olaf的回答所示,有一些众所周知的工具可以做到这一点.
我的问题是,我已经有两个1遍链接排序,其中一个在~85秒内运行,另一个在〜70秒内运行.很明显,我们可以在一次通过订单中进行更多优化.
我在git中有两个开发分支,我经常需要在两者之间进行更改.然而,真正令人沮丧的是,每次我在git中更改分支时,整个项目都会重建,因为某些文件的文件系统时间戳会发生变化.
Ofc,makefile被配置为将项目构建到两个不同的构建目录中.
有没有办法解决?编译是一个非常漫长而耗时的过程......
编辑: - 这是一个稍微更详细的问题解释...说我有一个头文件Basic.h,它包含在许多其他文件中.分支1和分支2之间的Basic.h不同.
现在假设我已将分支1编译为build_branch1,将分支2编译为build_branch2.说我目前检查了分支2.现在我签出分支1并更改File1.cpp并重新编译.理想情况下,因为自上次编译它以来只有File1.cpp发生了变化,所以这是唯一应该重新编译的文件.
但是,由于Basic.h由于结帐而更改了时间戳,因此将重新编译包含Basic.h的所有文件.我想避免这种情况.
正如问题听起来一样.我想从20120203减去说20120115并得到19作为答案.在shell脚本中实现此功能的最佳方法是什么?
我很想知道如何将类安排在内存中.具有继承和虚函数.
我知道这不是由c ++语言标准定义的.但是,是否有任何简单的方法可以通过编写一些测试代码来了解您的特定编译器如何实现这些?
编辑: - 使用以下一些答案: -
#include <iostream>
using namespace std;
class A {
public:
int a;
virtual void func() {}
};
class B : public A {
public:
int b;
virtual void func() {}
};
class C {
public:
int c;
virtual void func() {}
};
class D : public A, public C {
public:
int d;
virtual void func() {}
};
class E : public C, public A {
public:
int e;
virtual void func() {}
}; …
Run Code Online (Sandbox Code Playgroud) 我正在复制粘贴ld的一个部分: -
-u symbol
--undefined=symbol
Force symbol to be entered in the output file as an undefined symbol. Doing this
may,for example, trigger linking of additional modules from standard libraries.
`-u' may be repeated with different option arguments to enter additional
undefined symbols.
Run Code Online (Sandbox Code Playgroud)
如何实际使用此选项?如何在源代码中触发其他模块的链接,以及该选项何时实际有用?
我正在使用Avery Pennarun的git-subtree,它是git的扩展.
我如何使用git子树从子仓库中挑选一个提交到我的主仓库?另外,在我已经对该前缀进行git子树拉取之后,如何进入子回购历史中的特定提交?
我主要在壁球提交模式下运行它.
我试图弄清楚汇编指令实际上做了什么
addsd -8(%rbp), %xmm0
Run Code Online (Sandbox Code Playgroud)
我知道它是带有SSE2的x86-64机器上的浮点运算.另外,我知道%xmm0是一个寄存器.但是,我不确定的是-8(%rbp)的含义.手册有点令人困惑.
基本上,问题是,-8(%rbp)意味着它从寄存器中获取一个值(可能是rbp的最后8个字节),还是从内存中获取一个值(偏移量为-8的浮点值) rbp中包含的地址.
正如问题所说的那样.我想使用共享内存在两个lisp进程之间进行通信.有关如何做到这一点的任何指示?
我可以在clozure中看到一些关于这样做的教程: -
http://ccl.clozure.com/manual/chapter4.7.html
有人能指点我用类似的库来用sbcl做这个吗?
我有这些文件: -
1.h: -
#include <iostream>
using namespace std;
template <typename A>
void f() {
cout<<"generic\n";
}
Run Code Online (Sandbox Code Playgroud)
1.cpp: -
#include "1.h"
template <>
void f<int> () {
cout<<"for ints only\n";
}
Run Code Online (Sandbox Code Playgroud)
main.cpp: -
#include "1.h"
int main() {
f<int>();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
现在,我用这样的g ++编译和运行它们: -
g++ -c 1.cpp -o 1.o
g++ main.cpp 1.o
./a.out
Run Code Online (Sandbox Code Playgroud)
我得到: -
for ints only
Run Code Online (Sandbox Code Playgroud)
另一方面,我用icpc编译它像这样: -
icpc -c 1.cpp -o 1.o
icpc main.cpp 1.o
./a.out
Run Code Online (Sandbox Code Playgroud)
我得到: -
generic
Run Code Online (Sandbox Code Playgroud)
C++标准对此有何看法?是否有任何一个编译器"正确"而另一个"错误"或者在这个问题上标准模糊不清并且两者都"正确"?
c++ ×6
git ×2
inheritance ×2
ld ×2
performance ×2
assembly ×1
bash ×1
c ×1
cherry-pick ×1
common-lisp ×1
date ×1
g++ ×1
git-pull ×1
git-subtree ×1
icc ×1
layout ×1
linker ×1
linux ×1
makefile ×1
sbcl ×1
sse2 ×1
templates ×1
x86 ×1
x86-64 ×1