c++ 功力深的进啊
这是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的。 大家帮忙分析一下,谢谢了啊