最近我很惊讶std::unique_ptrSTL容器的元素是可以接受的,因为我认为这些元素需要提供以下功能(这个页面说的相同):
但是std::unique_ptr不能复制使它所拥有的指针由单个对象拥有,这与上述要求相矛盾.
标准是否改变了要求?如果是这样,有什么变化?也许可移动物体或可复制物体都足够了?我在网上搜索了自C++ 11以来需求是否发生了变化,但我找不到任何帮助我的页面...
我正在试图弄清楚如何-march正确设置选项,以查看使用gcc 4.7.2在我的电脑上启用和禁用选项之间的性能差异.
在尝试编译之前,我试图找到什么是-march我的电脑的最佳选择.我的电脑有Pentium G850,其架构是Sandy Bridge.所以我提到了gcc 4.7.2手册,发现它-march=corei7-avx似乎是最好的.
但是,我记得基于Sandy Bridge的Pentium缺乏AVX和AES-NI指令集支持,Pentium G850也是如此.所以-march=corei7-avx不是一个合适的选择.
我想出了一些潜在的选择:
-march=corei7-avx -mno-avx -mno-aes-march=corei7 -mtune=corei7-avx-march=native考虑到我的信息,第一个选项看起来很合理,但我担心除了AVX和AES-NI之外可能缺少其他功能.第二种选择看起来很安全,但由于它可能会错过Sandy Bridge上的一些小功能-march=corei7.第三个选项将解决我的所有问题,但我听说这个选项有时会误检测CPU的功能,所以我想知道如何手动执行此操作.
我用Google搜索并搜索了StackOverflow和SuperUser,但我找不到任何明确的解决方案......
应该设置哪些选项?
自由函数allocate_shared可以与任何标准兼容分配器一起使用.但是shared_ptr的构造函数和重置方法呢?
template<class Y, class D, class A> shared_ptr(Y * p, D d, A a);
template<class Y, class D, class A> void reset(Y * p, D d, A a);
Run Code Online (Sandbox Code Playgroud)
手册说D应该提供一个调用操作符,用于删除指针,A必须是一个标准的兼容分配器.如果是这样,为什么需要D?不能一个一举两得的分配和delocation?您是否认为为每个自定义分配器提供删除器的要求使上述方法几乎无用?当我使用自定义分配器时,我去了allocate_shared.我怎么知道释放自定义分配器分配的内存的正确方法是什么?
编辑:在使用逐字分配器和删除器进行一些实验后,我发现分配器传递给shared_ptr的构造函数和工厂函数allocate_shared仅用于分配shared_ptr的内部结构.allocate_shared从不使用传递的分配器来分配共享对象.我认为增强手册可以解释如何更明确地使用分配器.
我正在尝试使我的C++代码异常安全,并且遇到一个问题,既不询问朋友也不搜索网络会有所帮助.
根据我的理解,当使用构造函数创建一个可能抛出异常的对象时,创建代码需要用try块括起来并且异常处理完成catch(){}.
如果创建是基于堆的(例如,new使用默认分配器编辑),我可以将异常处理代码放在创建附近,如下所示:
void f() {
// work unrelated to Hoge object here
try {
Hoge *pHoge = new Hoge(); // could throw an exception
} catch(HogeException& ex) {
// handle exception
}
// rest of work here
}
Run Code Online (Sandbox Code Playgroud)
但是,如果创建是基于堆栈的,由于try块的范围,我无法找到方法来执行此操作并使用下面的代码:
void g() {
// work unrelated to Hoge object here
try {
Hoge hoge; // could throw an exception
// rest of work here
} catch(HogeException& ex) {
// handle exception
} …Run Code Online (Sandbox Code Playgroud)