C++ 取消引用类型双关指针将打破严格的别名规则
我的问题与我之前提出的问题密切相关: 我在网上看到过不同的警告帖子,但不幸的是,它们没有涵盖我的问题 简而言之,我想在堆栈上声明一些空间,然后将其用作某种类型T的数组,其中T可以是任何类型(尤其是非POD类型),我不能使用C++11 我尝试使用的两个表的声明是:C++ 取消引用类型双关指针将打破严格的别名规则,c++,C++,我的问题与我之前提出的问题密切相关: 我在网上看到过不同的警告帖子,但不幸的是,它们没有涵盖我的问题 简而言之,我想在堆栈上声明一些空间,然后将其用作某种类型T的数组,其中T可以是任何类型(尤其是非POD类型),我不能使用C++11 我尝试使用的两个表的声明是: char m_rawMemory[sizeof(T) * _size]; T(& m_tabT)[_size]; 解决我的问题的建议解决方案是: union Data { Data() {} T values
char m_rawMemory[sizeof(T) * _size];
T(& m_tabT)[_size];
解决我的问题的建议解决方案是:
union Data {
Data() {}
T values[Size];
} data;
如果不是这样,那就太好了,我不能使用C++11,因为我的编译器不支持无限制的联合(用于嵌入式环境的程序),所以与POD不同的类型将无法编译
因此,我决定创建char表,并按以下方式使用它:
m_tabT(reinterpret_cast<T(&)[_size]>(m_rawMemory)
m_tabT(重新解释投射(m_rawMemory)
这是汇编,但在标题中给出了警告。因此,我的问题是:
为什么我会收到这个警告?
如何正确地做到这一点?我认为有很多资源可以解释违反严格别名规则的问题。阅读您之前的问题,在我看来,您可以使用
vector
,传入一个分配器,返回指向“堆栈”的指针,而不是模仿array
已分配内存。别名规则意味着您重新解释到的类型可以有不同(更严格)的对齐规则并触发硬件异常。请尝试从T[]以另一种方式重新解释它
到char*
。我认为有很多资源可以解释违反严格别名规则的问题。阅读您之前的问题,在我看来,您可以使用vector
,传入一个分配器,返回指向“堆栈”的指针,而不是模拟数组已分配内存。别名规则意味着您重新解释到的类型可以有不同(更严格)的对齐规则并触发硬件异常。请尝试以另一种方式重新解释它,从T[]
到char*
。