- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
有人可以解释一下关于在 http://en.cppreference.com/w/cpp/types/aligned_storage 中进行转换的代码吗?好吗?
可以如下代码
return *static_cast<const T*>(static_cast<const void*>(&data[pos]));
替换为
return *reinterpret_cast<const T*>(&data[pos]);
?
这里为什么用了两个casting?非常感谢。
洪
最佳答案
根据标准(§ 5.2.10 reinterpret_cast
,第 7 节):
A pointer to an object can be explicitly converted to a pointer to a different object type. When a prvalue
v
of type “pointer toT1
” is converted to the type “pointer tocv T2
”, the result isstatic_cast<cv T2*>(static_cast<cv void*>(v))
if bothT1
andT2
are standard-layout types and the alignment requirements ofT2
are no stricter than those ofT1
.Converting a prvalue of type “pointer to
T1
” to the type “pointer to T2” (whereT1
andT2
are object types and where the alignment requirements ofT2
are no stricter than those ofT1
) and back to its original type yields the original pointer value. The result of any other such pointer conversion is unspecified.
因此,我们可以得出以下结论:
reinterpret_cast<*T>(ptr)
相当于static_cast<*T>(static_cast<void*>(ptr))
static_cast<>(ptr)
并不总是等于 ptr
,但是reinterpret_cast<>(ptr)
始终等于 ptr
reinterpret_cast
安全地关于c++ - std::aligned_storage 的 static_cast 和 reinterpret_cast,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19300142/
std::tr1::aligned_storage 的基本用法是什么?它可以用作像下面这样的数据类型 Foo 的自动存储器吗? struct Foo{...}; std::tr1::ali
std::aligned_storage结构提供了一个 type typedef 至少根据 cppreference : Provides the member typedef type, which
_declspec(align(32)) struct St{ int foo; }; typedef std::aligned_storage::value>::type Ta; int m
为了测试特定类型是否适合 aligned_storage,我创建了以下测试结构: template struct fits_in_storage : public std::integral_cons
我正在使用 std::aligned_storage 作为变体模板的后备存储。问题是,一旦我在 gcc 上启用 -O2,我就开始收到“取消引用类型双关指针将破坏严格别名”的警告。 真正的模板要复杂得多
我有一些代码基本上可以做到这一点: struct Base { virtual ~Base() = default; virtual int forward() = 0; }; str
如果我理解正确的话,std::aligned_storage 的主要优点是它管理对齐。它还可以使用 memcpy() 进行复制,并且可以与 POD 类型一起使用。 但是! 1) POD 类型默认由编译
假设我有一个类型模板参数 T。 假设我有一个 std::aligned_storage 如下: typename std::aligned_storage::type storage; 我想将新的 T
标准是否以某种方式保证 sizeof(typename aligned_storage::type)从它的地址开始可以写入对齐存储的实际可用数据大小是多少?我问这个的原因是我正在实现一个 std::f
boost::aligned_storage为了在 c++11 之前的世界中提供对齐存储,数据类型对我很有用。我有一个包含此存储成员的类: template class RoutineStorage
为什么支持在 std::aligned_storage_t 中定义扩展对齐实现?指定一个在内部适当大小的缓冲区上使用 alignas() 的实现应该很容易吗? 最佳答案 所有对扩展对齐的支持都是imp
C++ 标准声明,关于 std::aligned_storage 模板, Align shall be equal to alignof(T) for some type T or to defaul
我一直在努力了解称为 aligned_storage 的 TR1 添加项。在阅读以下文件的同时N2165 , N3190和 N2140我这辈子都看不到清楚描述所用内存的堆栈或堆性质的语句。 我看过 m
我正在尝试使用 std::aligned_storage 模式实现简单静态数组的 16 字节对齐: #include int main() { const size_t SIZE = 8;
分配 std::aligned_storage::type 时在堆上,我总是得到一个偏移 16 个字节的指针(在 x64 上;在 x86 上它偏移 8 个字节)。换句话说,这: #include #
自 C++11 以来,有一个专用模板结构 std::aligned_storage 和 alignas 关键字用于存储任何选定类型的对齐数据。我想知道是否可以为 C++03 中支持的 std::ali
std::aligned_storage::type 是 POD 类型。 POD类型可以memcpy。但是,如果将新的非平凡可复制类型放置到 std::aligned_storage 会发生什么?它可
在 C 语言中,有没有一种方法可以使堆栈上的存储过度对齐(即比从类型系统推断出的对齐更多)? 对于动态分配的内存中的变量,如果所有其他方法都失败了,我们总是可以手动对齐,但是对于自动分配的内存中的变量
ideone link #include #include using namespace std; // Non-trivially-copyable type. struct NTC {
C++17 引入了一个新类型,std::byte,所以现在我们终于有了一个一等公民类型来表示内存中的字节。除了标准中的新颖性之外,对象创建、生命周期的开始和结束、别名等的 C++ 规则在大多数时候都相
我是一名优秀的程序员,十分优秀!