小编Goo*_*ofy的帖子

std :: shared_ptr线程安全解释

我正在阅读http://gcc.gnu.org/onlinedocs/libstdc++/manual/shared_ptr.html,我仍然不清楚一些线程安全问题:

  1. 标准保证引用计数是处理线程安全的并且它是独立于平台的,对吧?
  2. 类似的问题 - 标准保证只有一个线程(持有最后一个引用)将在共享对象上调用delete,对吗?
  3. shared_ptr不保证存储在其中的对象的任何线程安全吗?

编辑:

伪代码:

// Thread I
shared_ptr<A> a (new A (1));

// Thread II
shared_ptr<A> b (a);

// Thread III
shared_ptr<A> c (a);

// Thread IV
shared_ptr<A> d (a);

d.reset (new A (10));
Run Code Online (Sandbox Code Playgroud)

在线程IV中调用reset()将删除在第一个线程中创建的A类的先前实例并将其替换为新实例?此外,在IV线程中调用reset()之后,其他线程只会看到新创建的对象?

c++ shared-ptr c++11

100
推荐指数
3
解决办法
6万
查看次数

为什么英特尔在其处理器中隐藏内部RISC内核?

从Pentium Pro(P6微体系结构)开始,英特尔重新设计了它的微处理器,并在旧的CISC指令下使用了内部RISC内核.由于Pentium Pro所有CISC指令都分为较小的部分(uops),然后由RISC内核执行.

一开始我很清楚英特尔决定隐藏新的内部架构并强迫程序员使用"CISC shell".由于这一决定,英特尔可以在不破坏兼容性的情况下完全重新设计微处理器架构,这是合理的.

但是我不明白一件事,为什么英特尔仍然保留了多年内隐藏的内部RISC指令集?为什么他们不让程序员使用RISC指令,比如使用旧的x86 CISC指令集?

如果英特尔长期保持向后兼容性(我们仍然在64位模式旁边有虚拟8086模式),为什么它们不允许我们编译程序以便它们绕过CISC指令并直接使用RISC核心?这将开启自然的方式来慢慢放弃x86指令集,现在已弃用(这是英特尔决定在内部使用RISC核心的主要原因,对吧?).

看看新的英特尔'酷睿i'系列,我看到,他们只扩展了CISC指令集,增加了AVX,SSE4等.

x86 intel cpu-architecture

85
推荐指数
5
解决办法
4万
查看次数

std :: tuple是如何实现的?

我想知道在C++ 0x的标准库中如何实现元组.我试着阅读libstdc ++手册中的描述,然后阅读模板列表,但是很难理解它是如何工作的,特别是在阅读代码时.

有人能用几句话解释我的元组实现的想法吗?我想知道这一点,因为我想在我的代码中使用元组,我想了解它是如何工作的以及它带来了什么类型的开销(仅扩展编译时间,对内存执行许多复制操作,在构造函数中执行许多其他函数)等).

c++ tuples std c++11

26
推荐指数
3
解决办法
1万
查看次数

在调用非虚拟基本方法时,C++中是否有任何惩罚/成本的虚拟继承?

当我们从其基类调用常规函数成员时,在C++中使用虚拟继承是否会在编译代码中产生运行时损失?示例代码:

class A {
    public:
        void foo(void) {}
};
class B : virtual public A {};
class C : virtual public A {};
class D : public B, public C {};

// ...

D bar;
bar.foo ();
Run Code Online (Sandbox Code Playgroud)

c++ runtime overhead virtual-inheritance

22
推荐指数
3
解决办法
3874
查看次数

在运行时将代码注入可执行文件

我正在研究应用程序(用C++编写),它在运行时生成一些机器代码(现在是Linux,x86-64,但我计划在ARM上进行迁移).接下来,它将生成的代码存储在内存中并通过跳转到内存位置来执行它.很长一段时间我都遇到了分配可执行内存的问题,但我终于解决了它:

uint8_t *memory = mmap (NULL, length, PROT_READ | PROT_WRITE | PROT_EXEC, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
Run Code Online (Sandbox Code Playgroud)

到目前为止它的确有效,但我不确定它是否是做这些事情的优雅方式.我想知道可执行加载器是如何做到的

linux assembly arm x86-64

13
推荐指数
2
解决办法
2899
查看次数

使用shared_ptr的开销和实现

简短介绍:我正在研究多线程代码,我必须在两个线程之间共享动态分配的对象.为了使我的代码更清晰(并且更不容易出错),我希望在每个线程中明确地"删除"对象,这就是我想要使用的原因shared_ptr.

第一个问题:

我想知道在运行时是否实现-> operatorin shared_ptr有一些额外的开销(例如更大unique_ptr).我正在谈论的对象通常是在创建之后仅复制一次的longlife实例(当我在线程之间分发它们时),然后我只访问这些对象的方法和字段.

我知道,shared_ptr这只保护引用计数.

第二个问题:

shared_ptr在libstdc ++中如何优化?它总是使用互斥量还是利用原子操作(我专注于x86和ARM平台)?

c++ shared-ptr c++11

13
推荐指数
2
解决办法
5666
查看次数

不抛出异常时的性能(C++)

我已经阅读了很多关于C++异常和我看到的内容,特别是异常性能是一个难题.我甚至试图在g ++的内幕下看看如何在汇编中表示异常.

我是C程序员,因为我更喜欢低级语言.前段时间我决定使用C++而不是C,因为它的成本很低,它可以让我的生活更轻松(类比结构,模板等).

回到我的问题,因为我看到异常只会在它们发生生成开销,因为它需要一长串的跳转和比较指令才能找到合适的异常处理程序.在正常的程序执行中(没有错误),异常开销等于正常的返回代码检查.我对吗?

c++ exception

12
推荐指数
2
解决办法
1699
查看次数

在Linux上使用FUSE实现异步文件系统

我试图在FUSE的邮件列表上询问,但到目前为止我还没有收到任何回复......我有几个问题.我将实现一个低级别的FUSE文件系统并fuse_chan使用epoll 监视描述符.

  1. 我必须为我的文件系统中的所有对象伪造inode吗?是否有关于为VFS中的对象选择inode的规则(例如,我是否必须仅使用正值,还是可以在某个范围内使用值)?

  2. 我可以使fuse_chan的描述符无阻塞吗?如果是,请告诉我是否可以假设 fuse_chan_recv()/ fuse_chan_send() 将接收/发送整个请求结构,或者我是否必须使用处理部分发送和接收的功能覆盖它们?

  3. 怎么样buffer size?我看到在fuse_loop()为每个调用分配一个新缓冲区,所以我假设缓冲区大小不固定.但是,可能有一些最大可能的缓冲区大小?然后,我可以分配更大的缓冲区并减少内存分配操作.

linux fuse

7
推荐指数
1
解决办法
1629
查看次数

R值插入不适用于unordered_map

我正在使用存储库中最新的可用GCC构建.我决定使用它,因为一些额外的C++ 0x功能.然而现在我坚持使用什么假设工作 - 我想通过r值添加新的元素来映射.简化代码,演示了问题:

#include <tr1/unordered_map>

class X
{
    public:
        X (void) { /* ... */ };
        X (const X& x) = delete;
        X (X&& x) { /* ... */ };
};

int main (void)
{
    std::tr1::unordered_map<int, X> map;

    // using std::tr1::unordered_map<int, X>::value_type didn't help too
    std::pair<int, X> value (1, X ());

    map.insert (std::move (value));
}
Run Code Online (Sandbox Code Playgroud)

请注意,当X使用某些原始类型替换类时,如int代码编译并且工作正常.

在我的生产中,对应于X的代码类也没有复制构造函数.

错误消息(像所有与模板相关的错误)冗​​长且不可读,我不确定将它放在这里是否是个好主意.如果您想要错误消息,请通知我,因此我将更新此问题.消息的最后部分很有趣:

(...)
/usr/include/c++/trunk/ext/new_allocator.h:106:9: error: use of deleted function ‘constexpr std::pair<_T1, _T2>::pair(const std::pair<_T1, _T2>&) [with _T1 = const int, …
Run Code Online (Sandbox Code Playgroud)

c++ tr1 c++11

7
推荐指数
1
解决办法
1374
查看次数

重写虚拟方法的警告不明确

我有一个Base类,提供一些业务逻辑和虚拟方法,可以进一步覆盖.此外,我想延长一些类继承BaseDecorator.这是简化的设置:

struct Base
{
    ~Base() = default;
    virtual void foo(int) {};
    virtual void foo(double) {};
};

template<typename T>
struct Decorator : public T
{

};

struct Middle : public Decorator<Base>
{
    virtual void foo(int) override {};    
};

struct Final : public Middle
{
    virtual void foo(double) override {};    
};
Run Code Online (Sandbox Code Playgroud)

当我使用clang和-Wall -Wextra编译代码时,我收到以下警告:

21 : <source>:21:18: warning: 'Final::foo' hides overloaded virtual function [-Woverloaded-virtual]
virtual void foo(double) override {};    
             ^

16 : <source>:16:18: note: hidden overloaded virtual …
Run Code Online (Sandbox Code Playgroud)

c++

5
推荐指数
2
解决办法
1165
查看次数