我正在尝试深入探索新C++ 11标准的所有选项,同时使用std :: async并阅读其定义,我注意到两件事,至少在linux下使用gcc 4.8.1:
pthread,如果你想使用std::async你需要pthread.在这一点上,我很自然地问为什么选择std :: async甚至是一组简单的仿函数?这是一个根本无法扩展的解决方案,您调用的未来越多,您的程序响应就越少.
我错过了什么吗?你能展示一个被授予以异步,非阻塞方式执行的例子吗?
我正在尝试确定libcxxabi在linux下的llvm项目中构建和使用是否有意义.
我的构建libcxxabi与之相关联
ldd libc++abi.so.1.0
linux-vdso.so.1 => (0x00007fff2e0db000)
libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007fd658f0d000)
librt.so.1 => /lib/x86_64-linux-gnu/librt.so.1 (0x00007fd658d05000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fd65893c000)
libc++.so.1 => /path/where/clang/is // edited
/lib64/ld-linux-x86-64.so.2 (0x00007fd6593ab000)
libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007fd658465000)
Run Code Online (Sandbox Code Playgroud)
所以它的使用gcc_s图书馆,GNU librt,唯一真正的区别在于它使用的事实libc++了libstdc++,但如何好这真的是什么?
鉴于abi库的关键作用,我应该libcxxabi在这样的平台下去吗?
我的问题不在于如何建立这个,或者如果这样可行,但如果这是一个好主意C++ - 明智的,我可以获得什么样的好处,或者如果你已经使用这个有什么样的好处.
不,这不是一个类的问题,我正在研究树和堆(部分排序的二叉树),我想知道如何正确定义这两个与通用数据结构相关的属性/动作.
我在一个交叉点,我试图在基于互斥锁的数据结构和无锁(可能无等待)的数据结构之间选择一个.
虽然挖掘得更深,但我没有发现C++ 11标准支持原子类型的原子操作这一事实,甚至对于基于宽度的积分也没有atomic_uint32_t.换句话说,它不仅仅是未被授予真正原子的std::atomic<>接口,唯一看起来它被赋予整个标准库中的原子的东西是.std::atomic_flag
这是真的还是我遗失了什么?这是什么原因?我的意思是标准称为"原子"的东西显然根本不是原子的,甚至允许使用互斥锁或阻止呼叫.
我调用.p2align了这个汇编指令,它是由gccC程序源生成的.
据我所知,对齐访问比未对齐访问更快,asm程序也不会自动对齐内存位置或优化内存访问,因此您必须这样做.
我真的无法读到这一点.p2align 4,,15,尤其是最后一部分15.
正如许多文档报道的那样,跳过明显gcc产生2 ,而不是1 的事实; 我得到的是这段asm内存以这样的方式对齐内存,即每个位置占用2 ^ 4位,这意味着16位,所以我认为WORD在这种情况下a 是16位长是公平的.
现在15可能意味着什么?这是多少比特?计数是从0这样开始的,"实际"数量是16而不是15?
编辑:
我只是将相同的C源转换为32位和64位asm代码,内存总是以相同的方式与同一指令对齐.p2align 4,,15.这是为什么 ?
考虑到我用C++编写代码,如果可能的话,我想使用类似内在函数的解决方案来阅读有关硬件的有用信息,我的顾虑/注意事项是:
我要回答的最后一个问题是:如何用内在函数做类似的事情?因为我没有找到除CPUID操作码以外的任何东西来获取这种信息.
我很抱歉,如果这是一个超级简单的概念,但我发现很难获得正确的心态,以便正确使用由提供的消毒剂clang.
float foo(float f) { return (f / 0); }
Run Code Online (Sandbox Code Playgroud)
我编译这个小片段
clang++ -fsanitize=float-divide-by-zero -std=c++11 -stdlib=libc++ -c source.cpp -o osan
Run Code Online (Sandbox Code Playgroud)
而且我还在不使用消毒剂的情况下编译了我的对象的"正常"版本
clang++ -std=c++11 -stdlib=libc++ -c source.cpp -o onorm
Run Code Online (Sandbox Code Playgroud)
我期待一些详细的输出,或者来自控制台的一些错误,但是在检查文件时nm我只发现了1个差异
nm o* --demangle
onorm:
0000000000000000 T foo(float)
osan:
U __ubsan_handle_divrem_overflow
0000000000000000 T foo(float)
Run Code Online (Sandbox Code Playgroud)
所以在清理版本中有一个未定义的符号,其名称类似于我在编译时使用的清洁剂; 但是一切都是"沉默的",而且从铿锵的前端根本没有输出.
我应该如何使用消毒剂以及什么是正确的工作流程?那个未定义的符号有什么意义?
为什么我不能像这样为我的输出创建一个"空"流
std::ostream out;
Run Code Online (Sandbox Code Playgroud)
?
此行是与两个明显违法clang 3.4,并gcc 4.8.1根据与Linux的libstdc++,我真的不知道为什么,我的意思是,为什么我不能只是出于创建流无处并使用它就像我想?请注意std::ofstream out;100%确定.我只是没有得到这背后的逻辑.如果你认为在创建之后我可以使用这个缓冲区并与其他缓冲区共享一个公共缓冲区,这就更奇怪了,copyfmt所以我没有真正需要std::ostream将对象初始化为对象的创建是有用的.
请不要偏离这一点,我不需要stringstreams,ios因为我必须做的事情以及他们提供的方法和属性,我需要流.
我在linux下,我需要一个运行Android并支持OpenGL ES的虚拟机,我知道BlueStacks在Windows和Mac下运行良好,我想知道Linux是否有类似的解决方案.
谢谢.
PS
我在Ubuntu 13.04 64位下
你能否提出至少1个情况,其中存在实质性差异
union {
T var_1;
U var_2;
}
Run Code Online (Sandbox Code Playgroud)
和
var_2 = reinterpret_cast<U> (var_1)
Run Code Online (Sandbox Code Playgroud)
?
我对此的想法越多,它们对我来说就越相同,至少从实际的角度来看.
我发现的一个区别是虽然联合大小在大小方面是最大的数据类型,但是这篇文章中描述的reinterpret_cast可能会导致截断,因此普通的旧式C式联合比新的更安全. C++铸造.
你能概述一下这两者之间的区别吗?