【发布时间】:2015-03-20 02:29:27
【问题描述】:
标准promise/packaged_task 的分配器采用构造函数是否应该仅将分配器用于状态对象本身,或者应该为所有(内部)相关对象保证这一点?
[futures.promise]: "...为共享状态分配内存"
[futures.task.members]: "...分配存储内部数据结构所需的内存"
特别是以下错误或功能吗?
*MSVC 2013.4,Boost 1.57,short_alloc.h by Howard Hinnant
示例 1
#define BOOST_THREAD_VERSION 4
#include <boost/thread/future.hpp>
#include "short_alloc.h"
#include <cstdio>
void *operator new( std::size_t s ) {
printf( "alloc %Iu\n", s );
return malloc( s );
}
void operator delete( void *p ) {
free( p );
}
int main() {
const int N = 1024;
arena< N > a;
short_alloc< int, N > al( a );
printf( "[promise]\n" );
auto p = boost::promise< int >( std::allocator_arg, al );
p.set_value( 123 );
printf( "[packaged_task]\n" );
auto q = boost::packaged_task< int() >( std::allocator_arg, al, [] { return 123; } );
q();
return 0;
}
输出:
...
[promise]
alloc 8
alloc 12
alloc 8
alloc 24
[packaged_task]
alloc 8
alloc 12
alloc 8
alloc 24
FWIW,默认分配器的输出是
...
[promise]
alloc 144
alloc 8
alloc 12
alloc 8
alloc 16
[packaged_task]
alloc 160
alloc 8
alloc 12
alloc 8
alloc 16
示例 2
AFAICT,MSVC 的std::mutex 进行了不可避免的堆分配,因此使用它的std::promise 也是如此。这是符合标准的行为吗?
【问题讨论】:
-
您为什么在示例代码中使用
boost,并谈论std指定的行为?为什么不使用std? -
@Yakk:另外,我确实尝试过标准;参见示例 2。实际上,我先尝试了 std,然后转而使用 boost,希望能更多地使用自定义分配器 --- 但唉。
标签: visual-c++ c++11 boost language-lawyer c++14