相关疑难解决方法(0)

关于Hinnant的堆栈分配器的问题

我一直在使用Howard Hinnant的堆栈分配器,它就像一个魅力,但实现的一些细节对我来说有点不清楚.

  1. 为什么全球运营商newdelete使用?的allocate()deallocate()成员函数使用::operator new::operator delete分别.同样,成员函数construct()使用全局布局new.为什么不允许任何用户定义的全局或类特定的重载?
  2. 为什么对齐设置为硬编码16字节而不是std::alignment_of<T>
  3. 为什么构造函数和max_sizethrow()异常规范?这不是劝阻(参见例如更有效的C++第14项)?在分配器中发生异常时,是否真的有必要终止和中止?这是否随新的C++ 11 noexcept关键字而改变?
  4. construct()成员函数将是完美转发(在构造函数被调用)的理想选择.这是编写符合C++ 11标准的分配器的方法吗?
  5. 还需要进行哪些其他更改才能使当前代码C++ 11符合要求?

c++ memory-alignment exception-specification allocator c++11

32
推荐指数
1
解决办法
3149
查看次数

我什么时候应该担心对齐?

我最近学到了一些关于对齐的知识,但我不确定在哪种情况下它会成为一个问题.我怀疑有两种情况:

第一个是使用数组时:

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++

19
推荐指数
1
解决办法
1497
查看次数

C++的Option/Maybe类

我想在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)

c++ new-operator

5
推荐指数
1
解决办法
1723
查看次数