using vector to implement buffer

I was told that using vector to implement buffer is applicable, but using string to implement buffer is not applicable, because objects in vector are continuous in memory, while in string it is not guaranteed.

It is peculiar that my following codes test OK in red hat linux, but in SUSE, it leads to coredump. I don't have the chance to investigate in SUSE any more for the time being since I've not a SUSE server at hand.

#include <vector>
#include <iostream>
using namespace std; 

class Buf {
    vector<char> buf;
public:    
    Buf();
    Buf(size_t sz);
    void setSize(size_t sz);
    size_t getSize();
    char* head(); 
    char* head2();
};

Buf::Buf(){
}

Buf::Buf(size_t sz):buf(sz) {
    
}

void Buf::setSize(size_t sz){
    buf.resize(sz);
}

size_t Buf::getSize() {
    return buf.size();
}

char* Buf::head(){
    return &buf[0];
}

char* Buf::head2(){
    return &(*buf.begin());
}

class MessageBuffer
{
public:
    enum {HEAD_SIZE = 4, MAX_MESSAGE_SIZE = 65536};
    MessageBuffer(); 
    char* body();
    char* head();
    void setBodySize(int size);
    int getBodySize();
    int getTotalSize();
private:    
    vector<char> m_buff;
};

MessageBuffer::MessageBuffer() 
{
}

char* MessageBuffer:: body() 
{
    vector<char>::iterator it=m_buff.begin();
    char *begin = &(*it) + HEAD_SIZE;
    return begin;
}

char* MessageBuffer:: head()
{
    vector<char>::iterator it=m_buff.begin();
    char *begin = &(*it) + HEAD_SIZE;
    return begin; 
}

void  MessageBuffer:: setBodySize(int size)
{
    m_buff.resize(size+HEAD_SIZE);
    char *begin = &m_buff[0];
    begin[0]=(size >> 24) & 0xff;
    begin[1]=(size >> 16) & 0xff;
    begin[2]=(size >> 8) & 0xff;
    begin[3]=size  & 0xff;
}

int   MessageBuffer:: getBodySize()
{
    int size;
    char *begin = &m_buff[0];
    size = (begin[0] << 24) |(begin[1] << 16) |(begin[2] << 8) |(begin[3] ) ;
    return size; 
}

int   MessageBuffer:: getTotalSize() 
{
    return getBodySize() + HEAD_SIZE;    
}

int main() {
    //test Buf
    Buf buf(100);
    strcpy(buf.head(),"hello");
    strcpy((buf.head()+5)," world");
    cout << buf.head() << endl;
    strcpy(buf.head2(),"hello");
    strcpy((buf.head2()+5)," world");
    cout << buf.head2() << endl;
    //test MessageBuffer
    MessageBuffer buffer;
    buffer.setBodySize(100);
    cout << buffer.getTotalSize() << endl;
    cout << buffer.getBodySize() << endl;
    strcpy(buffer.body(), "hello");
    strcpy(buffer.body()+5," whole world"); 
    cout << buffer.body() << endl; 
    return 0;
}


 

發佈了109 篇原創文章 · 獲贊 14 · 訪問量 15萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章