创建动态大小的对象

Nec*_*lis 10 c++

删除的C代码,看到这是造成一些混乱(它不应该已经在那里开始.遗憾的任何不便,有Ç回答,因为仍然欢迎虽然:)

在几件事情我已经做了,我已经找到了需要创建具有动态大小和静态的大小,其中,静态部件是你的基本对象的成员,但动态部分是一个数组对象/缓冲直接追加到类,保持存储器中连续,因此减少需要分配的量(这些是不可重分配对象),并降低分片(虽然为下侧,它可能是更难找到一个足够大的尺寸的块,但是这很多较为少见 - 如果它甚至应该出现在所有 - 比堆破碎,这也是在嵌入式设备上有用,其中的内存是非常宝贵的(但我不这样做对目前嵌入式设备的任何东西),事情就是这样STD: :字符串需要避免,或者不能像琐碎的联合一样使用.

通常我会这样做的方式是(ab)使用malloc(std :: string不是故意使用的,并且由于各种原因):

struct TextCache
{
    uint_32 fFlags;
    uint_16 nXpos;
    uint_16 nYpos;
     TextCache* pNext;
    char pBuffer[0];
};

TextCache* pCache = (TextCache*)malloc(sizeof(TextCache) + (sizeof(char) * nLength));
Run Code Online (Sandbox Code Playgroud)

然而,这并不适合我,因为首先我想使用new,因此在C++环境中这样做,其次,它看起来很可怕:P

所以下一步是模板化的C++变量:

template <const size_t nSize> struct TextCache
{
    uint_32 fFlags;
    uint_16 nXpos;
    uint_16 nYpos;
     TextCache<nSize>* pNext;
    char pBuffer[nSize];
};
Run Code Online (Sandbox Code Playgroud)

然而,这存在将存储指向可变大小对象的指针变为"不可能"的问题,因此接下来的解决方法是:

class DynamicObject {};
template <const size_t nSize> struct TextCache : DynamicObject {...};
Run Code Online (Sandbox Code Playgroud)

然而,这仍然需要铸造,具有指针DynamicObject遍的时候更是一个动态大小的物体提炼出来的(这也看起来可怕,可从强制空类仍然有大小错误受苦的地方变得模糊,虽然这可能是一个古老的,灭绝的虫子......).

然后是这样的:

class DynamicObject
{
    void* operator new(size_t nSize, size_t nLength)
    {
        return malloc(nSize + nLength);
    }
};

struct TextCache : DynamicObject {...};
Run Code Online (Sandbox Code Playgroud)

看起来好多了,但会干扰已经有新的重载的对象(它甚至可能会影响新的放置......).

最后我提出了新的虐待:

inline TextCache* CreateTextCache(size_t nLength)
{
    char* pNew = new char[sizeof(TextCache) + nLength];
    return new(pNew) TextCache;
}
Run Code Online (Sandbox Code Playgroud)

然而,这可能是迄今为止最糟糕的想法,原因有很多.

有没有更好的方法来做到这一点?或者上述版本之一会更好,还是至少可以改进?是否甚至考虑过安全和/或糟糕的编程习惯?


正如我上面所说,我试图避免双重分配,因为这不需要2次分配,因此这使得将这些东西写入(序列化)到文件更容易.我所拥有的双重分配要求的唯一例外是其基本上为零开销.我遇到的唯一原因是我从固定缓冲区顺序分配内存(使用这个系统,我提出),但它也是一个特殊的例外,以防止超级复制.

Mar*_*som 8

我会为这个DynamicObject概念做出妥协.所有不依赖于大小的东西都会进入基类.

struct TextBase 
{ 
    uint_32 fFlags; 
    uint_16 nXpos; 
    uint_16 nYpos; 
     TextBase* pNext; 
}; 

template <const size_t nSize> struct TextCache : public TextBase
{ 
    char pBuffer[nSize]; 
}; 
Run Code Online (Sandbox Code Playgroud)

这应该减少所需的铸件.