删除的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次分配,因此这使得将这些东西写入(序列化)到文件更容易.我所拥有的双重分配要求的唯一例外是其基本上为零开销.我遇到的唯一原因是我从固定缓冲区顺序分配内存(使用这个系统,我提出),但它也是一个特殊的例外,以防止超级复制.
我会为这个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)
这应该减少所需的铸件.