是否需要显式构造char数组的每个成员?

问题描述 投票:4回答:1

请考虑以下代码:

#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()的后续调用。

c++ memory-management stl language-lawyer
1个回答
2
投票
据我所知,技术上是可以的。

[basic.life]

© www.soinside.com 2019 - 2024. All rights reserved.