基于LLVM官方页面,可以根据我的理解进行安装时优化,首先在分发之前编译到构建机器上的字节码,然后在目标机器上,在安装时将字节码转换为本机代码.
这个功能有没有真实世界的例子?更具体地说,我想知道是否有可能采用任意开源C/C++项目,该项目使用autoconf(即通常由其构建和安装./configure && make && make install),以及
./configure && make以特殊方式运行(例如,设置一些环境变量,甚至修改configure.ac或其他一些autoconf文件),以便它生成可执行文件和库作为字节代码;make install
以特殊方式运行,以便像往常一样安装所有文件,但将字节代码转换为可执行文件和库的本机代码.我试图在MacOSX上分析一些C++程序.所以我构建google-perftools了一个程序,使用MacPorts g ++ 4.7 -g编译,带有编译器标志,并链接到libprofiler.然后我跑了:
CPUPROFILE=cpu.profile ./a.out
Run Code Online (Sandbox Code Playgroud)
然后我运行pprof来生成输出:
[hidden ~]$ pprof --text ./a.out cpu.profile
Using local file ./a.out.
Using local file cpu.profile.
Removing __sigtramp from all stack traces.
Total: 282 samples
107 37.9% 37.9% 107 37.9% 0x000000010d72229e
16 5.7% 43.6% 16 5.7% 0x000000010d721a5f
12 4.3% 47.9% 12 4.3% 0x000000010d721de8
11 3.9% 51.8% 11 3.9% 0x000000010d721a4e
9 3.2% 55.0% 9 3.2% 0x000000010d721e13
8 2.8% 57.8% 8 2.8% 0x000000010d721a64
7 2.5% 60.3% 7 2.5% 0x000000010d7222f0
6 2.1% …Run Code Online (Sandbox Code Playgroud) 假设操作系统是linux.假设我打开了一个文件进行写入并获取文件描述符fdw.是否有可能获得另一个文件描述符fdr,只读访问该文件而不再调用open?我不想调用的原因open是底层文件可能已被其他进程在文件系统中移动甚至取消链接,因此重复使用相同的文件名对此类操作不可靠.所以我的问题是:如果仅提供文件描述符,是否有打开具有不同访问权限的文件描述符? 我认为,dup或者dup2不会改变访问权限.
clang 6.0.0接受以下代码,但gcc 8.2拒绝
enum class E {
Good, Bad,
};
struct S {
E e : 2;
int dummy;
};
S f() {
return {E::Good, 100};
}
Run Code Online (Sandbox Code Playgroud)
海湾合作委员会抱怨
错误:无法将'
{Good, 100}'从'<brace-enclosed initializer list>' 转换为'S'
哪一个是正确的?标准中哪里谈到这种情况?
我有一个类似序列的自定义对象s,该对象继承collections.Sequence并实现了custom __len__和__getitem__。它代表一大串字符串(> 4GB),并且延迟加载(我无法负担全部加载到内存中)。
我想对它进行RE匹配re.compile('some-pattern').match(s),但是失败了TypeError: expected string or buffer。
在实践中,模式并不是'.*'需要整个s加载的东西。通常需要前几十个字节来匹配;但是,我无法事先告知确切的字节数,并且我希望将其保持通用,因此我不想做类似的事情re.compile('some-pattern').match(s[:1000])。
关于如何创建str被接受的类似对象的任何建议re?
以下代码说明了我的失败尝试。继承str也不起作用。
In [1]: import re, collections
In [2]: class MyStr(collections.Sequence):
def __len__(self): return len('hello')
def __getitem__(self, item): return 'hello'[item]
...:
In [3]: print(re.compile('h.*o').match(MyStr()))
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-3-df08913b19d7> in <module>()
----> 1 print(re.compile('h.*o').match(MyStr()))
TypeError: expected string or buffer
Run Code Online (Sandbox Code Playgroud)
如果字符串的一大团来自单个大文件,那么我可以使用mmap它,它应该可以工作。但是,我的情况比较复杂。我有多个大文件,mmap每个文件都有一个,并有一个自定义类,它们是它们的串联视图。我实际上想从视图中的任何给定位置开始执行RE匹配。我在原始问题中忽略了这些细节,但是对于想了解为什么我有这样奇怪要求的人来说,这可能会有所帮助。
通过阅读c ++ 11 draft n3242,第20.7.2.5节,看起来我们在shared_ptr上有原子操作,这使我们能够在复杂的结构上进行无锁,而不必担心GC /内存泄漏.
但是,我无法在GCC-4.7.0中成功使用它.我只是测试了以下程序
#include <atomic>
#include <memory>
#include <string>
struct X {
int x;
double y;
std::string s;
};
int main() {
std::shared_ptr<X> x(new X);
auto p = std::atomic_load(&x);
}
Run Code Online (Sandbox Code Playgroud)
它有编译错误:
c.cpp:13:33: error: no matching function for call to ‘atomic_load(std::shared_ptr<X>*)’
Run Code Online (Sandbox Code Playgroud)
有谁知道我在这里错过了什么?或者只是gcc还没有实现呢?
我有一些程序在文件或某些内存缓冲区中处理一些数据.我想提供统一的方法来处理这些案件.
我可以1)mmap文件,以便我们可以统一处理它们作为内存缓冲区; 2)使用fopen和fmemopen创建FILE*,以便将它们统一访问为FILE*.
但是,我无法使用上述任何一种方法.我需要将它们作为文件描述符处理,因为我使用的其中一个库只接受文件描述符,并且它在文件描述符上进行mmap.
所以我的问题是,给定一个内存缓冲区(我们可以假设它与4K对齐),我们可以得到一个由这个内存缓冲区支持的文件描述符吗?我在其他一些问题中看到popen是一个答案,但我不认为popen中的fd可以是mmap-ed.
任何人都知道为什么以下代码无法编译:
[hidden]$ g++ -v |& tail -n 1
gcc version 4.8.1 20130603 (Red Hat 4.8.1-1) (GCC)
[hidden]$ cat c.cpp
struct X {
X() = default;
X(const X&) = default;
X(X&&) = default;
X& operator=(const X&) = delete;
X& operator=(X&&) = default;
};
void f(bool t) {
X a, b;
(t ? a : b) = X();
}
[hidden]$ g++ -std=c++11 -c c.cpp
c.cpp: In function ‘void f(bool)’:
c.cpp:11:15: error: use of deleted function ‘X& X::operator=(const X&)’
(t ? a : …Run Code Online (Sandbox Code Playgroud) 以下代码在gcc-4.7.1上编译:
struct X {};
template <class T = X, typename U>
void f(const U& m) {
}
int main() {
f<>(0);
}
Run Code Online (Sandbox Code Playgroud)
但是,这个没有:
struct X {};
template <class T = X, typename U>
void f(const U& m) {
auto g = [] () {};
}
int main() {
f<>(0);
}
Run Code Online (Sandbox Code Playgroud)
gcc-4.7.1抱怨:
c.cpp: In function 'void f(const U&)':
c.cpp:5:15: error: no default argument for 'U'
Run Code Online (Sandbox Code Playgroud)
所以我的问题是:在函数模板中将非默认参数置于默认参数之前是否正确?如果是的话,为什么不编译第二个呢?如果不是,为什么第一个编译?C++ 11标准如何说明这种语法?
我有一个AVX CPU(不支持AVX2),我想计算两个256位整数的按位xor.
由于_mm256_xor_si256仅在AVX2上可用,我可以将这256位加载为__m256使用_mm256_load_ps,然后执行a _mm256_xor_ps.这会产生预期的结果吗?
我主要担心的是,如果内存内容不是有效的浮点数,_mm256_load_ps那么寄存器中的位不会与寄存器中的位完全相同吗?
谢谢.
c++ ×6
c++11 ×4
gcc ×2
linux ×2
avx ×1
bit-fields ×1
c ×1
enum-class ×1
llvm ×1
llvm-clang ×1
macos ×1
mmap ×1
python ×1
python-2.7 ×1
regex ×1
shared-ptr ×1
simd ×1
sse ×1
templates ×1