据我所知,写时复制不是std::string在C++ 11中实现符合性的可行方法,但最近在讨论中我发现自己无法直接支持该语句.
我是否正确C++ 11不承认基于COW的实现std::string?
如果是这样,这个限制是否在新标准(其中)的某处明确说明了?
或者这个限制是否暗示,因为新要求的综合影响std::string排除了基于COW的实施std::string.在这种情况下,我会对"C++ 11有效禁止基于COW的std::string实现" 的章节和样式推导感兴趣.
我想知道什么是copy-on-write是什么以及它用于什么?Sun JDK教程中多次提到术语"写时复制数组",但我不明白它的含义.
我找到了以下命令:strings /usr/lib/libstdc++.so.6 | grep GLIBC从这里开始.它似乎工作,但这是一个ad-hoc /启发式方法.
是否有可用于查询C++库版本的特定命令?或者我找到了接受方法的方法?
采用这个简单的函数,在由std::mutex以下实现的锁定下递增整数:
#include <mutex>
std::mutex m;
void inc(int& i) {
std::unique_lock<std::mutex> lock(m);
i++;
}
Run Code Online (Sandbox Code Playgroud)
我希望这(在内联之后)以直接的方式编译,然后调用m.lock()增量.im.unlock()
检查生成的程序集的最新版本的gcc和clang,但是,我们看到一个额外的并发症.gcc首先考虑版本:
inc(int&):
mov eax, OFFSET FLAT:__gthrw___pthread_key_create(unsigned int*, void (*)(void*))
test rax, rax
je .L2
push rbx
mov rbx, rdi
mov edi, OFFSET FLAT:m
call __gthrw_pthread_mutex_lock(pthread_mutex_t*)
test eax, eax
jne .L10
add DWORD PTR [rbx], 1
mov edi, OFFSET FLAT:m
pop rbx
jmp __gthrw_pthread_mutex_unlock(pthread_mutex_t*)
.L2:
add DWORD PTR [rdi], 1
ret
.L10:
mov edi, eax …Run Code Online (Sandbox Code Playgroud) 我的目标是在Centos 7上使用gcc 7.2(和clang 6)构建与Centos 7目标兼容的可执行文件,而不安装devtoolset,但*使用较新的C++ ABI*.
较新的ABI修复了lib中的一些缺陷,这些缺陷在没有ABI更改的情况下无法修复.例如list :: size O(1)Vs O(n),字符串没有COW.
我猜测为什么在以下问题中可能无法实现这一点. -D_GLIBCXX_USE_CXX11_ABI = 1对CentOS 7上的devtoolset-7无效