我一直在使用Howard Hinnant的堆栈分配器,它就像一个魅力,但实现的一些细节对我来说有点不清楚.
new和delete使用?的allocate()和deallocate()成员函数使用::operator new和::operator delete分别.同样,成员函数construct()使用全局布局new.为什么不允许任何用户定义的全局或类特定的重载?std::alignment_of<T>?max_size有throw()异常规范?这不是劝阻(参见例如更有效的C++第14项)?在分配器中发生异常时,是否真的有必要终止和中止?这是否随新的C++ 11 noexcept关键字而改变?construct()成员函数将是完美转发(在构造函数被调用)的理想选择.这是编写符合C++ 11标准的分配器的方法吗?c++ memory-alignment exception-specification allocator c++11
我最近学到了一些关于对齐的知识,但我不确定在哪种情况下它会成为一个问题.我怀疑有两种情况:
第一个是使用数组时:
struct Foo {
char data[3]; // size is 3, my arch is 64-bit (8 bytes)
};
Foo array[4]; // total memory is 3 * 4 = 12 bytes.
// will this be padded to 16?
void testArray() {
Foo foo1 = array[0];
Foo foo2 = array[1]; // is foo2 pointing to a non-aligned location?
// should one expect issues here?
}
Run Code Online (Sandbox Code Playgroud)
第二种情况是使用内存池时:
struct Pool {
Pool(std::size_t size = 256) : data(size), used(0), freed(0) { }
template<class T>
T …Run Code Online (Sandbox Code Playgroud) 我想在C++中实现类似Scala的Option/Haskell-like Maybe类.出于效率原因,我不想使用动态分配的内存,也不想使用多态.另外,如果Option为None,我不希望创建任何嵌入类型的对象.
谁能告诉我以下方法是否会引起问题?我必须在我的Option类中为嵌入对象静态分配内存,但是我无法定义嵌入类型的成员字段,因为即使Option为None,也会在创建Option对象时初始化它.
template <typename T>
class Option {
private:
uint8_t _storage [sizeof (T)];
T * _embedded;
public:
Option () : _embedded (nullptr) {
}
Option (const T & obj) : _embedded (new (_storage) T (obj)) {
}
Option (const Option<T> & other)
: _embedded (
other->_embedded ? new (_storage) T (other->_embedded) : nullptr
) {
}
// ...
~Option () {
if (_embedded) _embedded->~T ();
}
};
Run Code Online (Sandbox Code Playgroud)