vector 变量的大小是多少个字节

Nosoft12345 2018-11-06 03:49:27
如题:

估计大家在使用的时候,基本没用到过 vector 所指的变量在内存占的字节。

基本都是vector .size的使用。

比如:

typedef struct MYText{

int d;
char name[20];

}MYTE,*pMYTE;


vertor<MYTE> cc;

MYTE m1 = {};
m1.d = 100;
memcpy(m1.name,"111",3);

MYTE m2 = {};
m2.d = 200;
memcpy(m2.name,"222"3);

cc.push_back(m1);
cc.push_back(m2);

void * pp = &cc;
int cc_len = ????

我要把这个vector的变量,按字节全部写入到文件中,




...全文
664 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
wxf54318 2018-11-09
  • 打赏
  • 举报
回复
弄个循环把每个结构体元素逐个写进去吧,如果考虑性能使用内存映射文件
Nosoft12345 2018-11-08
  • 打赏
  • 举报
回复
引用 7 楼 baiywcwttfln 的回复:
[quote=引用 6 楼 Nosoft12345 的回复:]
@A-De

那有没办法,将一个vector的变量,按实际的字节写入文件,在别的地方在读取实际字节数,转换成vector类型来用。

那你要对vector 序列化, 序例化规则得自己定,包括vector元素的类型,读的时候再反序例化[/quote]


多谢A-De,你说的很对。
hongss 2018-11-08
  • 打赏
  • 举报
回复
vector之类的模板就是为了把内存调用对象化,你现在又要去直接操作内存,那还用vector干什么呢
真相重于对错 2018-11-08
  • 打赏
  • 举报
回复
请百度c++序列化
lin5161678 2018-11-08
  • 打赏
  • 举报
回复
引用 5 楼 baiywcwttfln 的回复:
vector 不是pod类型,只有pod类型才能用你读的那种方法

vector<MYTE> p1;
p1.resize(len / sizeof(MYTE));
memcpy(&p1[0], ppp, len);

这里能这么写,完全是因为 MYTE 是 pod 类型,还有 vector 元素内存是连续的
不是说 myte是pod 就能这样写!!
比如 你这样写之后 p1的size结果是多少?
用迭代器遍历能获取到数据吗
lin5161678 2018-11-08
  • 打赏
  • 举报
回复
"我要把这个vector的变量,按字节全部写入到文件中,"
没有意义 生存期结束之后 里面的数据没意义
读出来也没用
赵4老师 2018-11-07
  • 打赏
  • 举报
回复
vector是对象,不是一段内存。
ahui5252 2018-11-07
  • 打赏
  • 举报
回复
A-De说的是对的,vector内部操作的是数组,本身还有first,last,end等指针变量.楼主存数据时存的是数组type.读出来时仍然是数组type,这时可以普通遍历,但直接将这数据的地址转换成vector肯定不行
linfengc 2018-11-06
  • 打赏
  • 举报
回复
楼上正解,另外每种Type结构你都要定义序列化反序列化方法。
A-De 2018-11-06
  • 打赏
  • 举报
回复
引用 6 楼 Nosoft12345 的回复:
@A-De

那有没办法,将一个vector的变量,按实际的字节写入文件,在别的地方在读取实际字节数,转换成vector类型来用。

那你要对vector 序列化, 序例化规则得自己定,包括vector元素的类型,读的时候再反序例化
Nosoft12345 2018-11-06
  • 打赏
  • 举报
回复
@A-De

那有没办法,将一个vector的变量,按实际的字节写入文件,在别的地方在读取实际字节数,转换成vector类型来用。

A-De 2018-11-06
  • 打赏
  • 举报
回复
vector 不是pod类型,只有pod类型才能用你读的那种方法

vector<MYTE> p1;
p1.resize(len / sizeof(MYTE));
memcpy(&p1[0], ppp, len);

这里能这么写,完全是因为 MYTE 是 pod 类型,还有 vector 元素内存是连续的
Nosoft12345 2018-11-06
  • 打赏
  • 举报
回复
长度是 cc.size() *sizeof(MYTE);

这个算的是什么长度?

肯定不是vector<MYTE> g_v;

这个g_v的实际所占的字节数

cc.size()=====是vector里包含的元素个数
sizeof(MYTE)=====是元素结构体的字节数

所以,cc.size()*sizeof(MYTE) 应该不是g_v的实际字节数
Nosoft12345 2018-11-06
  • 打赏
  • 举报
回复
不对。
我测了的。

我用一个程序去写,一个程序去读,不对。

写程序:

MYTE u1 = {};
u1.nAge = 10 ;
memcpy(u1.cName ,"mmm",3);

MYTE u2 = {};
u2.nAge = 20 ;
memcpy(u2.cName,"wwww",4);

g_v.push_back(u1);
g_v.push_back(u2);




int size3 = g_v.size() * size1;
void * p = &g_v;

FILE * pf = fopen("c:\\cc.txt","wb");
fwrite(p,size3,1,pf);
fclose(pf);


============================================
读程序:
FILE * fpp = fopen("c:\\cc.txt","rb");
fseek(fpp,0,SEEK_END);
int len = ftell(fpp);
void * ppp = malloc(len);
fseek(fpp,0,SEEK_SET);
fread(ppp,len,1,fpp);
fclose(fpp);

vector<MYTE> *p1 = (vector<MYTE>*)ppp;

这一行,拿到的数据不对。

你们可以试试。

另外:
sizeof(MYTE) * cc.size() ,这个仅仅求的是vector里面,几个元素的大小之和,

但vector<MYTE> 这个结构本身的大小不计算在内吗 ???


要用 void *pp = pp.data() (C++11以上) 或者 void *pp = &cc[0] 用这个也试过了,也不对。


你们可以试试。

只此冒泡君 2018-11-06
  • 打赏
  • 举报
回复
sizeof(MYTE) * cc.size();
A-De 2018-11-06
  • 打赏
  • 举报
回复
长度是 cc.size() *sizeof(MYTE);
写数据也不是用 void * pp = &cc;
要用 void *pp = pp.data() (C++11以上) 或者 void *pp = &cc[0]

64,647

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧