高效的多行向量

时间:2019-02-27 10:12:07

标签: c++ performance design-patterns vector dry

我需要一个高效的矢量实现,该矢量具有多行,每行具有相同的列数,这在C ++中不太难看。目前,我有以下内容:

class BaseVector {
protected: // variables
  int64_t _capacity;
  int64_t _nColumns;

protected:
  template<typename taItem> void Allocate(taItem * &p, const int64_t nItems) {
    p = static_cast<taItem*>(MemPool::Instance().Acquire(sizeof(taItem)*nItems));
    if (p == nullptr) {
      __debugbreak();
    }
  }
  template<typename taItem> void Reallocate(taItem * &p, const int64_t newCap) {
    taItem *np;
    Allocate(np, newCap);
    Utils::AlignedNocachingCopy(np, p, _nColumns * sizeof(taItem));
    MemPool::Instance().Release(p, _capacity * sizeof(taItem));
    p = np;
  }
  // Etc for Release() operation

public:
  explicit BaseVector(const int64_t initCap) : _capacity(initCap), _nColumns(0) { }
  void Clear() { _nColumns = 0; }
  int64_t Size() const { return _nColumns; }
};

class DerivedVector : public BaseVector {
    __m256d *_pRowA;
    __m256i *_pRowB;
    uint64_t *_pRowC;
    uint8_t *_pRowD;
    // Etc. for other rows
public:
    DerivedVector(const int64_t nColumns) : BaseVector(nColumns) {
        Allocate(_pRowA, nColumns);
        Allocate(_pRowB, nColumns);
        Allocate(_pRowC, nColumns);
        Allocate(_pRowD, nColumns);
        // Etc. for the other rows
    }
    void IncSize() {
        if(_nColumns >= _capacity) {
            const int64_t newCap = _capacity + (_capacity >> 1) + 1;
            Reallocate(_pRowA, newCap);
            Reallocate(_pRowB, newCap);
            Reallocate(_pRowC, newCap);
            Reallocate(_pRowD, newCap);
            // Etc. for other rows
            _capacity = newCap;
        }
        _nColumns++; 
    }
    ~DerivedVector() {
        // Call here the Release() operation for all rows
    }
};

此方法的问题是可以有30行,因此我必须手动输入30次Allocate,30次Reallocate,30次Release(并重复我自己)等

那么C ++中有什么方法可以使此代码保持DRY并保持快速?我对宏没问题,但对向量中的单元格的每次访问都没有很重的多态性,因为这会降低性能。

0 个答案:

没有答案