首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > VC/MFC >

c++ 底工深的进

2012-07-22 
c++ 功力深的进啊C/C++ code这是CArray 的部分源码templateclass TYPE, class ARG_TYPEvoid CArrayTYPE

c++ 功力深的进啊

C/C++ code
这是CArray 的部分源码template<class TYPE, class ARG_TYPE>void CArray<TYPE, ARG_TYPE>::SetSize(INT_PTR nNewSize, INT_PTR nGrowBy){    ASSERT_VALID(this);    ASSERT(nNewSize >= 0);    if(nNewSize < 0 )        AfxThrowInvalidArgException();    if (nGrowBy >= 0)        m_nGrowBy = nGrowBy;  // set new size    if (nNewSize == 0)    {        // shrink to nothing        if (m_pData != NULL)        {            for( int i = 0; i < m_nSize; i++ )                (m_pData + i)->~TYPE();            delete[] (BYTE*)m_pData;            m_pData = NULL;        }        m_nSize = m_nMaxSize = 0;    }    else if (m_pData == NULL)    {        // create buffer big enough to hold number of requested elements or        // m_nGrowBy elements, whichever is larger.#ifdef SIZE_T_MAX        ASSERT(nNewSize <= SIZE_T_MAX/sizeof(TYPE));    // no overflow#endif        size_t nAllocSize = __max(nNewSize, m_nGrowBy);        m_pData = (TYPE*) new BYTE[(size_t)nAllocSize * sizeof(TYPE)];        memset((void*)m_pData, 0, (size_t)nAllocSize * sizeof(TYPE));        for( int i = 0; i < nNewSize; i++ )#pragma push_macro("new")#undef new            ::new( (void*)( m_pData + i ) ) TYPE;#pragma pop_macro("new")        m_nSize = nNewSize;        m_nMaxSize = nAllocSize;    }    else if (nNewSize <= m_nMaxSize)    {        // it fits        if (nNewSize > m_nSize)        {            // initialize the new elements            memset((void*)(m_pData + m_nSize), 0, (size_t)(nNewSize-m_nSize) * sizeof(TYPE));            for( int i = 0; i < nNewSize-m_nSize; i++ )#pragma push_macro("new")#undef new                ::new( (void*)( m_pData + m_nSize + i ) ) TYPE;#pragma pop_macro("new")        }        else if (m_nSize > nNewSize)        {            // destroy the old elements            for( int i = 0; i < m_nSize-nNewSize; i++ )                (m_pData + nNewSize + i)->~TYPE();        }        m_nSize = nNewSize;    }    else    {        // otherwise, grow array        nGrowBy = m_nGrowBy;        if (nGrowBy == 0)        {            // heuristically determine growth when nGrowBy == 0            //  (this avoids heap fragmentation in many situations)            nGrowBy = m_nSize / 8;            nGrowBy = (nGrowBy < 4) ? 4 : ((nGrowBy > 1024) ? 1024 : nGrowBy);        }    以下代码中的nGrowBy = (nGrowBy < 4) ? 4 : ((nGrowBy > 1024) ? 1024 : nGrowBy);表示什么意思??nGrowBy是什么意思????为什么要和1024,  4  相比呢,什么用意??if (nGrowBy == 0)        {            // heuristically determine growth when nGrowBy == 0            //  (this avoids heap fragmentation in many situations)            nGrowBy = m_nSize / 8;            nGrowBy = (nGrowBy < 4) ? 4 : ((nGrowBy > 1024) ? 1024 : nGrowBy);        }    #pragma push_macro("new")#undef new                ::new( (void*)( m_pData + m_nSize + i ) ) TYPE;#pragma pop_macro("new")push_macro  把new压入栈中,然后又取消定义,再弹出, 干嘛呢???? 没事干啊 !!!之所以看Carray的源码是 ,看到一个大牛,自己实现了一个CArray, 为此对比着看mfc的。 大家帮忙分析一下,谢谢了啊


[解决办法]
以下代码中的nGrowBy = (nGrowBy < 4) ? 4 : ((nGrowBy > 1024) ? 1024 : nGrowBy);表示什么意思??

nGrowBy应该是增加分配内存时的大小。

如果 nGrowBy < 4 则,取4,否则:nGrowBy > 1024 则以1024为单位, 

就是 介于 4-1024 则 不变。 

this avoids heap fragmentation in many situations

这在大多数情况下,可以避免堆脆片化。

堆是以4096为1页。既然取1024,说明入栈操作以4byte为单位。
[解决办法]
探讨
嗯 这个帖子咋没人回复啊





引用:
1024 是os的页的大小。

SetSize函数 使函数分配的内存保持在 4----1024之间。

不知道这样做,是否充分利用内存??

热点排行