我的问题基本上是跟进:
How can I write a stateful allocator in C++11, given requirements on copy construction?
基本上,尽管 C++11 标准现在允许有状态分配器,但我们仍然有要求,如果您复制某个 Allocator , 拷贝必须通过 == 比较相等运算符与原件。这表明拷贝可以安全地解除分配由原始分配的内存,反之亦然。
所以,这马上就禁止分配器维护唯一的内部状态,例如平板分配器或内存池等。一种解决方案是使用 shared_ptr内部状态的指向实现惯用语,以便某些原始的所有拷贝Allocator使用相同的底层内存池。那还不错。除了...
根据上面提到的问题以及公认的答案,标准也似乎要求 Allocator<T>有一个可互操作的复制构造函数 Allocator<U> ,所以:
Allocator<T> alloc1;
Allocator<U> alloc2(alloc1);
assert(alloc1 == alloc2); // must hold true
换句话说,分配器类型必须可互操作,无论模板参数如何。这意味着如果我使用 Allocator<T> 分配一些内存,我必须能够使用 Allocator<U> 释放该内存从原始 Allocator<T> 构建的实例.
...对于任何尝试编写使用某种基于大小的内存池的分配器的尝试来说,这几乎都是一个阻碍,比如一个 simple_segregated_storage 池,它只返回基于 sizeof(T) 的特定大小的 block 。 .
但是……这是真的吗?
我意识到 Allocator<T>::rebind 需要可互操作的复制构造函数所以容器的用户不需要知道内部细节,比如链表节点类型等等。但据我所知,standard itself似乎没有说什么比要求 Allocator<U> 更严厉的了。由 Allocator<T> 构建必须与原始 Allocator<T> 比较相等实例。
标准基本上需要以下语义,其中 X 是一个类型 Allocator<T> , a1 和a2 是X 的实例,Y 是类型Allocator<U> , b 是 Allocator<U> 的实例.
来自:§ 17.6.3.5(分配器要求)
a1 == a2 returns true only if storage allocated from each can be deallocated via the other.
operator == shall be reflexive, symmetric, and transitive, and shall not exit via an exception.
a1 != a2 : same as !(a1 == a2)
a == b : same as a == Y::rebind<T>::other(b)
a != b : same as !(a == b)
X a1(a); Shall not exit via an exception. post: a1 == a
X a(b); Shall not exit via an exception. post: Y(a) == b, a == X(b)
所以,我读这个的方式,Allocator<T> 的实例由 Allocator<U> 构建不一定可以互换。该标准仅要求 a == b必须等同于 Y(a) == b , 不是 a == b必须是 true!
我认为对跨类型边界复制构造函数的要求使这一点变得困惑。但是,按照我的阅读方式,如果我有一个 Allocator<T> , 它必须有一个复制构造函数接受 Allocator<U> ,但这并不暗示:
Allocator<T> alloc1;
Allocator<U> alloc2(alloc1);
assert(alloc2 == alloc1);
换句话说,按照我的理解,上面的断言是允许失败的。但我对我在这里的理解没有信心,因为:
accepted answer to this question另说,回答者是一个有108K声望的人
标准中复制构造函数要求和相等性要求之间的交互有点困惑,我可能误解了措辞。
那么,我在这里是正确的吗? (顺便说一句, boost::pool_allocator 的实现似乎暗示我是正确的,假设 boost 开发人员关心标准合规性,因为这个分配器不能跨类型边界互换。)
最佳答案
你引用的最后一行:
X a(b); Shall not exit via an exception. post:Y(a) == b,a == X(b)
与你的结论相矛盾。
using X = Allocator<T>;
using Y = Allocator<U>;
Y b;
X a(b);
assert(Y(a) == b);
assert(a == X(b));
// therefore
assert(a == b);
关于c++ - C++11 有状态分配器是否可以跨类型边界互换?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27471684/
类classAprivatedeffooputs:fooendpublicdefbarputs:barendprivatedefzimputs:zimendprotecteddefdibputs:dibendendA的实例a=A.new测试a.foorescueputs:faila.barrescueputs:faila.zimrescueputs:faila.dibrescueputs:faila.gazrescueputs:fail测试输出failbarfailfailfail.发送测试[:foo,:bar,:zim,:dib,:gaz].each{|m|a.send(m)resc
我需要在客户计算机上运行Ruby应用程序。通常需要几天才能完成(复制大备份文件)。问题是如果启用sleep,它会中断应用程序。否则,计算机将持续运行数周,直到我下次访问为止。有什么方法可以防止执行期间休眠并让Windows在执行后休眠吗?欢迎任何疯狂的想法;-) 最佳答案 Here建议使用SetThreadExecutionStateWinAPI函数,使应用程序能够通知系统它正在使用中,从而防止系统在应用程序运行时进入休眠状态或关闭显示。像这样的东西:require'Win32API'ES_AWAYMODE_REQUIRED=0x0
给定这段代码defcreate@upgrades=User.update_all(["role=?","upgraded"],:id=>params[:upgrade])redirect_toadmin_upgrades_path,:notice=>"Successfullyupgradeduser."end我如何在该操作中实际验证它们是否已保存或未重定向到适当的页面和消息? 最佳答案 在Rails3中,update_all不返回任何有意义的信息,除了已更新的记录数(这可能取决于您的DBMS是否返回该信息)。http://ar.ru
使用带有Rails插件的vim,您可以创建一个迁移文件,然后一次性打开该文件吗?textmate也可以这样吗? 最佳答案 你可以使用rails.vim然后做类似的事情::Rgeneratemigratonadd_foo_to_bar插件将打开迁移生成的文件,这正是您想要的。我不能代表textmate。 关于ruby-使用VimRails,您可以创建一个新的迁移文件并一次性打开它吗?,我们在StackOverflow上找到一个类似的问题: https://sta
我在MiniTest::Spec和Capybara中使用以下规范:find_field('Email').must_have_css('[autofocus]')检查名为“电子邮件”的字段是否具有autofocus属性。doc说如下:has_css?(path,options={})ChecksifagivenCSSselectorisonthepageorcurrentnode.据我了解,字段“Email”是一个节点,因此调用must_have_css绝对有效!我做错了什么? 最佳答案 通过JonasNicklas得到了答案:No
查看Ruby的CSV库的文档,我非常确定这是可能且简单的。我只需要使用Ruby删除CSV文件的前三列,但我没有成功运行它。 最佳答案 csv_table=CSV.read(file_path_in,:headers=>true)csv_table.delete("header_name")csv_table.to_csv#=>ThenewCSVinstringformat检查CSV::Table文档:http://ruby-doc.org/stdlib-1.9.2/libdoc/csv/rdoc/CSV/Table.html
我的瘦服务器配置了nginx,我的ROR应用程序正在它们上运行。在我发布代码更新时运行thinrestart会给我的应用程序带来一些停机时间。我试图弄清楚如何优雅地重启正在运行的Thin实例,但找不到好的解决方案。有没有人能做到这一点? 最佳答案 #Restartjustthethinserverdescribedbythatconfigsudothin-C/etc/thin/mysite.ymlrestartNginx将继续运行并代理请求。如果您将Nginx设置为使用多个上游服务器,例如server{listen80;server
通过rubykoans.com,我在about_array_assignment.rb中遇到了这两段代码你怎么知道第一个是非并行赋值,第二个是一个变量的并行赋值?在我看来,除了命名差异之外,代码几乎完全相同。4deftest_non_parallel_assignment5names=["John","Smith"]6assert_equal["John","Smith"],names7end45deftest_parallel_assignment_with_one_variable46first_name,=["John","Smith"]47assert_equal'John
这个问题在这里已经有了答案:Checktoseeifanarrayisalreadysorted?(8个答案)关闭9年前。我只是想知道是否有办法检查数组是否在增加?这是我的解决方案,但我正在寻找更漂亮的方法:n=-1@arr.flatten.each{|e|returnfalseife
我发现ActiveRecord::Base.transaction在复杂方法中非常有效。我想知道是否可以在如下事务中从AWSS3上传/删除文件:S3Object.transactiondo#writeintofiles#raiseanexceptionend引发异常后,每个操作都应在S3上回滚。S3Object这可能吗?? 最佳答案 虽然S3API具有批量删除功能,但它不支持事务,因为每个删除操作都可以独立于其他操作成功/失败。该API不提供任何批量上传功能(通过PUT或POST),因此每个上传操作都是通过一个独立的API调用完成的