草庐IT

strict-aliasing

全部标签

c++ - 将字节数组转换为 POD

假设我有一个无符号字符数组,代表一堆POD对象(例如,从套接字读取或通过mmap读取)。它们代表哪些类型以及在什么位置是在运行时确定的,但我们假设每个类型都已经正确对齐。将这些字节“转换”为相应的POD类型的最佳方法是什么?解决方案应该符合c++标准(假设>=c++11),或者至少保证可以使用g++>=4.9、clang++>=3.5和MSVC>=2015U3。编辑:在linux、windows上,在x86/x64或32/64位arm上运行。理想情况下,我想做这样的事情:uint8_tbuffer[100];//fillede.g.fromnetworkswitch(buffer[0]

c++ - 将字节数组转换为 POD

假设我有一个无符号字符数组,代表一堆POD对象(例如,从套接字读取或通过mmap读取)。它们代表哪些类型以及在什么位置是在运行时确定的,但我们假设每个类型都已经正确对齐。将这些字节“转换”为相应的POD类型的最佳方法是什么?解决方案应该符合c++标准(假设>=c++11),或者至少保证可以使用g++>=4.9、clang++>=3.5和MSVC>=2015U3。编辑:在linux、windows上,在x86/x64或32/64位arm上运行。理想情况下,我想做这样的事情:uint8_tbuffer[100];//fillede.g.fromnetworkswitch(buffer[0]

c++ - 将 int 放入 char 数组中是否需要放置 new 合法?

由于C++别名规则,您不能随意将(一个int*)指向char数组,这似乎达成了一些共识。从另一个问题——Genericchar[]basedstorageandavoidingstrict-aliasingrelatedUB--似乎允许通过placementnew(重新)使用存储。alignas(int)charbuf[sizeof(int)];voidf(){//turnthememoryintoanint:(??)fromthePOVoftheabstractmachine!::new(buf)int;//isthisstrictlyrequired?(aside:it'sobvi

c++ - 将 int 放入 char 数组中是否需要放置 new 合法?

由于C++别名规则,您不能随意将(一个int*)指向char数组,这似乎达成了一些共识。从另一个问题——Genericchar[]basedstorageandavoidingstrict-aliasingrelatedUB--似乎允许通过placementnew(重新)使用存储。alignas(int)charbuf[sizeof(int)];voidf(){//turnthememoryintoanint:(??)fromthePOVoftheabstractmachine!::new(buf)int;//isthisstrictlyrequired?(aside:it'sobvi

c++ - 实践中的 union 、别名和类型双关语 : what works and what does not?

我无法理解使用带有GCC的union可以做什么和不可以做什么。我阅读了有关它的问题(特别是here和here),但它们关注的是C++标准,我觉得C++标准和实践(常用的编译器)之间存在不匹配。特别是,我最近在GCConlinedoc中发现了令人困惑的信息。在阅读编译标志-fstrict-aliasing时。它说:-fstrict-aliasingAllowthecompilertoassumethestrictestaliasingrulesapplicabletothelanguagebeingcompiled.ForC(andC++),thisactivatesoptimizati

c++ - 实践中的 union 、别名和类型双关语 : what works and what does not?

我无法理解使用带有GCC的union可以做什么和不可以做什么。我阅读了有关它的问题(特别是here和here),但它们关注的是C++标准,我觉得C++标准和实践(常用的编译器)之间存在不匹配。特别是,我最近在GCConlinedoc中发现了令人困惑的信息。在阅读编译标志-fstrict-aliasing时。它说:-fstrict-aliasingAllowthecompilertoassumethestrictestaliasingrulesapplicabletothelanguagebeingcompiled.ForC(andC++),thisactivatesoptimizati

c++ - C++ (GCC) 中的 C99 严格别名规则

据我了解,GCC在C++中支持其所有C99功能。但是C++代码中如何处理C99严格别名?我知道在不相关类型之间使用C进行强制转换不是严格混叠安全的,并且可能会生成不正确的代码,但是C++呢?由于严格别名不是C++标准的一部分(对吗?),GCC必须自己指定语义。我认为const_cast和static_cast在相关类型之间进行强制转换,因此它们是安全的,而reinterpret_cast可以打破严格的别名规则。这是正确的理解吗? 最佳答案 不,你可能混合了不同的东西。严格的别名规则与C99标准完全无关。严格的别名规则Root于自[标

c++ - C++ (GCC) 中的 C99 严格别名规则

据我了解,GCC在C++中支持其所有C99功能。但是C++代码中如何处理C99严格别名?我知道在不相关类型之间使用C进行强制转换不是严格混叠安全的,并且可能会生成不正确的代码,但是C++呢?由于严格别名不是C++标准的一部分(对吗?),GCC必须自己指定语义。我认为const_cast和static_cast在相关类型之间进行强制转换,因此它们是安全的,而reinterpret_cast可以打破严格的别名规则。这是正确的理解吗? 最佳答案 不,你可能混合了不同的东西。严格的别名规则与C99标准完全无关。严格的别名规则Root于自[标

c++ - 浮点位和严格的别名

我试图在不调用未定义行为的情况下从float中提取位。这是我的第一次尝试:unsignedfoo(floatx){unsigned*u=(unsigned*)&x;return*u;}据我了解,由于严格的别名规则,这不能保证有效,对吧?如果使用字符指针进行中间步骤,它是否有效?unsignedbar(floatx){char*c=(char*)&x;unsigned*u=(unsigned*)c;return*u;}还是我必须自己提取单个字节?unsignedbaz(floatx){unsignedchar*c=(unsignedchar*)&x;returnc[0]|c[1]当然,这

c++ - 浮点位和严格的别名

我试图在不调用未定义行为的情况下从float中提取位。这是我的第一次尝试:unsignedfoo(floatx){unsigned*u=(unsigned*)&x;return*u;}据我了解,由于严格的别名规则,这不能保证有效,对吧?如果使用字符指针进行中间步骤,它是否有效?unsignedbar(floatx){char*c=(char*)&x;unsigned*u=(unsigned*)c;return*u;}还是我必须自己提取单个字节?unsignedbaz(floatx){unsignedchar*c=(unsignedchar*)&x;returnc[0]|c[1]当然,这