请考虑以下代码:
#include <memory>
template<typename Allocator>
char* allocate_array(Allocator alloc, size_t n)
{
static_assert(std::is_same<typename Allocator::value_type, char>::value);
char* data = alloc.allocate(n);
// (1)
for (size_t i=0; i<n; ++i) {
new (data+i) char();
}
return data;
}
char* copy_array(size_t n, const char* original)
{
char* copy = allocate_array(std::allocator<char>(), n);
// (2)
for (size_t i=0; i<n; ++i) {
copy[i] = original[i];
}
return copy;
}
即使要保证每个字符都可以在(1)
中写入后才能被读取,为防止程序具有未定义的行为,用(2)
标记的新放置初始化是否必要?还是可以安全地将其删除?
请注意,即使在-O3
,这也没有得到优化,我看到gcc和clang都生成了对memset()
和memcpy()
的后续调用。
[basic.life]