Есть вопрос о добавлении C ++ Pointer. Если вы посмотрите на снимок экрана при условии, что вы в основном видите, что я делаю memcpy (m_pBuf + m_iWritePtr .... и это добавление указателя памяти не работает должным образом.
Я думал, что добавление m_pBuf + m_iWritePtr добавит байты m_iWritePtr к моему адресу памяти m_pBuf. m_pBuf - указатель на массив структур; то есть (T *) m_pBuf = new T [cnt], где T - это имя типа, а cnt - количество выделенных объектов T. В данном случае это простая структура. Размер (T) в этом случае составляет 260.
Вызов memcpy вызывает ошибку, и я знаю, что моя математика указателя неверна, но я не уверен на 100% почему. Я думал, что memcpy закодирован, чтобы взять базовый адрес и добавить несколько n * 260 байтов, чтобы получить смещение в буфере. ПРИМЕЧАНИЕ. Этот код используется для работы, когда это не было реализацией шаблона, а T был просто символом *. Теперь, когда T является шаблоном с некоторым типом имени, добавление смещения больше не работает, как ожидалось.
Итак, если вы посмотрите на снимок экрана ниже, вот результаты различных вычислений / ссылок, которые я сделал, используя отладчик / инспектор компилятора и калькулятор:
The memory address of m_pBuf = 0x01E7E0E0
The memory address of m_pBuf[1] = 0x01E8EE04
the memory address of m_pBuf+1 = 0x01E8EE04
the memory address of m_pBuf++ = 0x01E8EBFC
the memory address of m_pBuf+260 = 0x01E7E1E4 (the calculator's result)
Я пытаюсь понять, что здесь происходит. Первые два кажутся правильными, но я не понимаю, почему ни один из них не равен. Это 32-битный компилятор в Windows 7-64bit.
Для дальнейшего объяснения, это кольцевой буфер типа T с размером n * T объектов хранения. Вот код:
template<typename T>
bool TMsgBuffer<T>::PutMsgEx(T *pBuf, unsigned long nObjCount )
{
bool bResult = false;
unsigned long MaxWriteSize, nPutLen;
Lock();
MaxWriteSize = GetMaxWriteSize(); // this returns size of my buffer in total.
nPutLen = nObjCount * m_nObjSize; // m_nObjSize is set else where to sizeof(T)
if(nPutLen <= MaxWriteSize)
{
// easy case, no wrapping
if( m_iWritePtr + nPutLen <= m_nBufSize )
{
memcpy(m_pBuf + m_iWritePtr, pBuf, nPutLen);
m_iWritePtr += nPutLen;
}
else // need to wrap
{
m_iFirstChunkSize = m_nBufSize - m_iWritePtr;
m_iSecondChunkSize = nPutLen - m_iFirstChunkSize;
memcpy(m_pBuf + m_iWritePtr, pBuf, m_iFirstChunkSize );
memcpy(m_pBuf, pBuf + m_iFirstChunkSize, m_iSecondChunkSize );
m_iWritePtr = m_iSecondChunkSize;
}
//m_MsgCount++;
m_MsgCount+= nObjCount;
bResult = true;
}
Unlock();
return bResult;
}