- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
C++17 引入了一个新类型,std::byte
,所以现在我们终于有了一个一等公民类型来表示内存中的字节。除了标准中的新颖性之外,对象创建、生命周期的开始和结束、别名等的 C++ 规则在大多数时候都相当复杂且不直观,所以每当我觉得 std::byte
是正确的工具我也很紧张,不愿意使用它,因为害怕无意中召唤未定义行为的炎魔。
一个这样的例子是用于放置新的缓冲区:
#include <memory>
#include <cstddef>
#include <type_traits>
struct X { double dummy[4]; char c; };
auto t1()
{
// the old way
std::aligned_storage_t<sizeof(X)> buffer;
X* x = new (&buffer) X{};
x->~X();
}
auto t2()
{
// the new way?
std::byte buffer[sizeof(X)];
X* x = new (&buffer) X{};
x->~X();
}
t2
是否完全安全并且等同于 t1
?
针对对齐问题,怎么样:
auto t3()
{
alignas(X) std::byte buffer[sizeof(X)];
X* x = new (&buffer) X{};
x->~X();
}
最佳答案
Is
t2
perfectly safe and equivalent witht1
?
没有。事实上,两者都不好。
t2
不好的原因NathanOliver表示:未对齐。你需要写:
alignas(X) std::byte storage[sizeof(X)];
t1
也有点这个问题,因为你几乎肯定想写 aligned_storage_t<sizeof(X), alignof(X)>
而不仅仅是 aligned_storage_t<sizeof(X)>
.如果X
过度对齐,你会在这里失去它。如果X
只是很大但没有对齐要求,你最终会得到一个相对过度对齐的存储。
t1
由于一个特别特殊的原因也很糟糕:aligned_storage
并不能完全保证你认为它能保证什么。特别是,它保证 X
可以放入 aligned_storage<sizeof(X)>
,但不保证它可以完全。 specification很简单:
The member typedef
type
shall be a trivial standard-layout type suitable for use as uninitialized storage for any object whose size is at mostLen
and whose alignment is a divisor of Align.
即aligned_storage<16>::type
保证至少为 16 个字节,但符合要求的实现很容易为您提供 32 个或 4K。那除了使用的问题aligned_storage<16>
意外而不是aligned_storage_t<16>
.
这就是为什么 P1413作为论文存在:aligned_storage
有点糟糕。
所以真正的答案实际上只是写一些类似 libstdc++ 的 __aligned_membuf
的东西:
template <typename T>
struct storage_for {
alignas(T) std::byte data[sizeof(T)];
// some useful constructors and stuff, probably some getter
// that gives you a T* or a T const*
};
关于c++ - std::byte 可以替换 std::aligned_storage 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58288225/
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++ 规则在大多数时候都相
我是一名优秀的程序员,十分优秀!