我正在阅读http://gcc.gnu.org/onlinedocs/libstdc++/manual/shared_ptr.html,我仍然不清楚一些线程安全问题:
编辑:
伪代码:
// 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()之后,其他线程只会看到新创建的对象?
从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等.
我想知道在C++ 0x的标准库中如何实现元组.我试着阅读libstdc ++手册中的描述,然后阅读模板列表,但是很难理解它是如何工作的,特别是在阅读代码时.
有人能用几句话解释我的元组实现的想法吗?我想知道这一点,因为我想在我的代码中使用元组,我想了解它是如何工作的以及它带来了什么类型的开销(仅扩展编译时间,对内存执行许多复制操作,在构造函数中执行许多其他函数)等).
当我们从其基类调用常规函数成员时,在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++编写),它在运行时生成一些机器代码(现在是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)
到目前为止它的确有效,但我不确定它是否是做这些事情的优雅方式.我想知道可执行加载器是如何做到的
简短介绍:我正在研究多线程代码,我必须在两个线程之间共享动态分配的对象.为了使我的代码更清晰(并且更不容易出错),我希望在每个线程中明确地"删除"对象,这就是我想要使用的原因shared_ptr.
第一个问题:
我想知道在运行时是否实现-> operatorin shared_ptr有一些额外的开销(例如更大unique_ptr).我正在谈论的对象通常是在创建之后仅复制一次的longlife实例(当我在线程之间分发它们时),然后我只访问这些对象的方法和字段.
我知道,shared_ptr这只保护引用计数.
第二个问题:
shared_ptr在libstdc ++中如何优化?它总是使用互斥量还是利用原子操作(我专注于x86和ARM平台)?
我已经阅读了很多关于C++异常和我看到的内容,特别是异常性能是一个难题.我甚至试图在g ++的内幕下看看如何在汇编中表示异常.
我是C程序员,因为我更喜欢低级语言.前段时间我决定使用C++而不是C,因为它的成本很低,它可以让我的生活更轻松(类比结构,模板等).
回到我的问题,因为我看到异常只会在它们发生时生成开销,因为它需要一长串的跳转和比较指令才能找到合适的异常处理程序.在正常的程序执行中(没有错误),异常开销等于正常的返回代码检查.我对吗?
我试图在FUSE的邮件列表上询问,但到目前为止我还没有收到任何回复......我有几个问题.我将实现一个低级别的FUSE文件系统并fuse_chan使用epoll 监视描述符.
我必须为我的文件系统中的所有对象伪造inode吗?是否有关于为VFS中的对象选择inode的规则(例如,我是否必须仅使用正值,还是可以在某个范围内使用值)?
我可以使fuse_chan的描述符无阻塞吗?如果是,请告诉我是否可以假设
fuse_chan_recv()/ fuse_chan_send()
将接收/发送整个请求结构,或者我是否必须使用处理部分发送和接收的功能覆盖它们?
怎么样buffer size?我看到在fuse_loop()为每个调用分配一个新缓冲区,所以我假设缓冲区大小不固定.但是,可能有一些最大可能的缓冲区大小?然后,我可以分配更大的缓冲区并减少内存分配操作.
我正在使用存储库中最新的可用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) 我有一个Base类,提供一些业务逻辑和虚拟方法,可以进一步覆盖.此外,我想延长一些类继承Base与Decorator.这是简化的设置:
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)