【发布时间】:2017-07-11 17:25:32
【问题描述】:
这几乎是教科书对新位置的标准用法
template<size_t Len, size_t Align>
class aligned_memory
{
public:
aligned_memory() : data((char*)(((std::uintptr_t)mem + Align - 1) & -Align)) {}
char* get() const {return data;}
private:
char mem[Len + Align - 1];
char* data;
};
template<typename T, size_t N>
class Array
{
public:
Array() : sz(0) {}
void push_back(const T& t)
{
new (data.get() + sz++ * sizeof(T)) T(t);
}
void pop_back()
{
((T*)data.get() + --sz)->~T();
}
private:
aligned_memory<N * sizeof(T), alignof(T)> data;
size_t sz;
};
看起来还不错,在我们研究严格混叠之前,这是否格式正确似乎存在一些冲突
阵营不良
- C++'s Strict Aliasing Rule - Is the 'char' aliasing exemption a 2-way street?
- Strict aliasing rule and 'char *' pointers
阵营整齐
- Does encapsulated char array used as object breaks strict aliasing rule
- How to avoid strict aliasing errors when using aligned_storage
他们都同意char* 可能总是引用另一个对象,但有人指出反过来这样做是不正确的。
显然,我们的char[] 转换为char*,然后转换为T*,用于调用其析构函数。
那么,上面的程序是否违反了严格的别名规则?具体来说,标准中的什么地方说它是格式良好的还是格式不正确的?
编辑:作为背景信息,这是在 alignas 和 std::launder 出现之前为 C++0x 编写的。没有专门要求 C++0x 解决方案,但它是首选。
alignof 是作弊,但这里是为了举例。
【问题讨论】:
-
阅读[basic.life] 已经十亿次了,无法决定答案
-
在内部,
std::vector类通常将其动态数组实现为字节数组。 -
@Someprogrammerdude 标准库不需要(通常也不能)以 100% 严格符合 C++ 的方式实现。
-
Those answers 如果您还没有阅读它们,可能会有所帮助。
-
@Rakete1111 我之前读过(并赞成)这个答案,
aligned_memory不适用于unions。我在回答问题时遇到了这个问题,它需要 C++0x,没有alignas
标签: c++ language-lawyer c++03