- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在考虑将自制的共享指针实现为垃圾回收器的一部分,以避免std::shared_ptr
内部产生原子开销(可能很小)。大致相当于:
template <typename T>
struct my_atomic_shared
{
std::atomic<std::size_t> refcount;
std::unique_ptr<T> value;
};
atomic<small integers>
是等效的,但转储asm会将
mov
的
std::size_t
与
xchgl
的
atomic
相对应。我现在正在考虑以下(可能是UB调用)实现:
template <typename T>
struct my_normal_shared
{
std::size_t refcount;
std::unique_ptr<T> value;
};
template <typename T>
struct my_shared
{
// Surprisingly tedious constructor/destructor definition omitted
enum {ATOMIC, NORMAL} tag;
union
{
my_atomic_shared<T> atomic;
my_normal_shared<T> normal;
} value;
void promote()
{
// pseudocode. Sequential consistency, calls should go via store/load
if(tag == NORMAL)
{
T got = *(value.normal);
*(value.atomic) = got;
tag = ATOMIC;
}
}
};
promote()
实例传递到另一个线程之前调用
my_shared<>
。
atomic<>
变量放入并集注定会失败。
template <typename T>
struct my_shared_state
{
enum {ATOMIC, NORMAL} tag;
union
{
std::atomic<std::size_t> atomic;
std::size_t normal;
} refcount;
T value;
void incr();
void decr();
}
template <typename T>
struct my_shared_pointer
{
my_shared_state<T> * state;
// ctors and dtors modify refcount held in state
}
最佳答案
首先,在shared_ptr和其他引用计数的指针设计中,引用计数不在shared_ptr类中。它在共享指针指向的节点中。
因此,关系为:
template<typename T>
class Node
{
std::atomic<unsigned int> RefCount;
T * obj;
};
template<typename T>
class shared_ptr
{
Node<T> * node;
T * shadow;
};
Node<T>
,它“拥有”动态创建的对象,以及所有已“链接”到该对象的shared_ptr的引用计数器。
shared_ptr<T>
具有指向
Node<T>
的obj指针的“阴影”指针。
class AtomicRefCount
{ ...
};
class NonAtomicRefCount
{ ...
};
template< typename T, typename Ref >
class Node : public Ref
{ ...
};
typedef Node< SomeStruct, AtomicRefCount > SomeStruct_Node;
shared_ptr<T>
无法理解它们,它们必须是
shared_ptr< T, Ref >
template< typename T > struct MetaPtrTypes
{
typedef typename SmartPointers::LockPolicy< T, SmartPointers::StrongAttachmentPolicy > StrongLocking;
typedef typename SmartPointers::NoLockPolicy< T, SmartPointers::WeakAttachmentPolicy > WeakNoLocking;
typedef SmartPointers::LockPolicy< T, SmartPointers::WeakAttachmentPolicy > WeakLocking;
typedef SmartPointers::NoLockPolicy< T, SmartPointers::StrongAttachmentPolicy > StrongNoLocking;
typedef SmartPointers::PublicAccessPolicy< T, StrongNoLocking > PublicStrongNoLock;
typedef SmartPointers::MetaPtr< T, StrongLocking > LPtr;
typedef SmartPointers::MetaPtr< T, WeakNoLocking > WPtr;
typedef SmartPointers::MetaPtr< T, WeakLocking > WLPtr;
typedef SmartPointers::MetaPtr< T, PublicStrongNoLock > MPtr;
typedef T Type;
};
MetaPtrTypes< SomeClass > SomeClassPtrs;
这样做的是给了
SomeClassPtrs::MPtr
这样的类型,这是一种shared_ptr。 WPtr是一个弱指针,两者都与std::shared_ptr和std::weak_ptr有点相似,但是具有该期间的shared_ptr不可用的几个自定义内存分配选项,并且具有某些锁定功能,这些锁定功能通常需要在应用程序中使用互斥锁来保护shared_ptr的(因为向shared_ptr写入不是线程安全的)。
typedef std::shared_ptr< SomeClass > SPtr;
MetaPtr< T, PublicStrongNoLock >
。这是一个已建立的政策构建范例。 MetaPtr就像前面提到的
Node< T, Ref >
一样,但是其中嵌入了一些策略。
typedef typename SmartPointers
::LockPolicy< T, SmartPointers
::StrongAttachmentPolicy > StrongLocking;
typedef SmartPointers
::LockPolicy< T, SmartPointers
::WeakAttachmentPolicy > WeakLocking;
Standard memory allocation
Custom memory allocation
Garbage collection/memory management
Fast locking of writeable pointers
Lightweight reference counted smart pointers
Non-reference counted smart pointers (something like unique_ptr)
Array/Container aware smart pointers
GPU resource managers (loading/unloading textures,models and shader code)
关于c++ - 联盟中的atomic <>作为性能黑客,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32773186/
一段时间以来,我一直在努力理解 hadoop 中的联邦。我的问题是假设我有两个 NameNode NN1 和 NN2,NN1 管理金融命名空间 NN2 管理 IT 命名空间。如果 NN1 出现故障,我
我想翻译 winnt.h 中的一些类型定义,其中包含一些与位域的联合。然而,这是正确的做法吗?我特别不确定 _TP_CALLBACK_ENVIRON_V3 中的联合。 typedef struct
这个问题已经有答案了: PDO binding values for MySQL IN statement [duplicate] (8 个回答) 已关闭 7 年前。 $prepare=$text->
什么时候应该使用 union ?为什么我们需要它们? 最佳答案 union 通常用于在整数和 float 的二进制表示之间进行转换: union { int i; float f; } u;
什么时候应该使用 union ?为什么我们需要它们? 最佳答案 union 通常用于在整数和 float 的二进制表示之间进行转换: union { int i; float f; } u;
不久前宣布 Office 365 将支持 SAML 联合 Office 365 and SAML我想知道如何集成我们的内部 SSO 服务器来使用它?是否需要事件目录?我们所有的用户数据都存储在数据库中
我在 Users 和 UsersProjects 之间建立关系。 UserProjects.UserId 引用 Users.UserId 我想找到 UserProjects 中的用户,UserProj
在我的 Android SQLite 数据库中,我有一列是日期时间,格式为 YYYY-MM-DD HH:MM。我想要一个查询(或实际上是一个游标),它会给我所有的行,比如说 2015 年 5 月。排序
我的概念可能听起来有点神秘,但我提供了一些启动信息,说明我们在编译程序时如何使用 GCC 在程序中使用 GDB API/调试技术。我们绝对可以告诉 gcc 也链接 GDB 库。最终的帮助是当编译的程序
据说:“union 是一种特殊的类类型,一次只能保存一个它的非静态数据成员。”(http://en.cppreference.com/w/cpp/language/union ) 但它怎么能容纳不止一
Java/SpringBoot 中是否有 GraphQL 联合网关。在java中找不到任何实现。看到几个带有联合图的例子,但网关在 native 节点上。 检查了 Apollo 和 netflix D
我有一个非常大的表(将近 2,000,000 条记录)拆分为 2 个较小的表。一张表只包含上周的记录,另一张表包含所有其余的(很多......) 现在我得到了一些存储过程/函数,用于在拆分之前查询大表
我有 2 个由 UNION 组合的 SELECT 语句。我不想将所有结果按从一行到下一行的顺序堆叠,而是希望将第二个 SELECT 语句的结果/列添加到第一个 SELECT 语句的结果/列旁边: 以下
我使用 NestJS 和 Apollo Federation 有一段时间了,似乎自从上次更新以来我得到了 “(node:19113) DeprecationWarning:‘buildFederate
运行composer require league/flysystem-aws-s3-v3时,我得到:league/flysystem-aws-s3-v3[2.0.0, ..., 2.x-dev] r
我有两个表treeview_items和file_up treeview_items file_up 还有一个查询(不是我写的) SELECT * FROM treeview_items UNION
不确定我到底应该寻找什么,所以我正在寻求帮助。 我有两个表,通过查询我需要吐出一个。两张表如下: 交易: TransactionID SiteID EmployeeName 520
我需要向查询中添加文字值。我的尝试 var aa = new List(); aa.Add(0); var a = Products.Select(p => p.sku).Distinct().Uni
下面的前三个查询返回正确的数字,而最后一个返回错误的数字。它应该返回 153,而不是返回 8193。我不知道这个数字是从哪里来的。 遍历查询正确返回 153 条记录。 >>> Project.sele
我知道对于下面的代码,下面的“非法”是未定义的(虽然有些编译器允许它),因为 union 成员“a”是事件的,然后我们从 union 成员“b”读取。问题是,“AmILegal”中的代码是否修复了它,
我是一名优秀的程序员,十分优秀!