如何方便地知道一个结构体占用的内存空间大小?

Hell_Knight 2009-10-05 02:37:10
struct RecvStruct
{
CString m_Type;
CString m_Machine_ID;
CString m_TableName;
CString m_TimeStamp;
CString m_Content;
SOCKET m_sock;
};
类似这样的结构体啊,我觉得手动地判断,一个成员一个成员地去算出它们占用的内存空间大小,然后求和,好像很麻烦。。我不知道有没有什么比较方便地办法可以求出一个结构体所占用的内存空间大小?
...全文
880 38 打赏 收藏 转发到动态 举报
写回复
用AI写文章
38 条回复
切换为时间正序
请发表友善的回复…
发表回复
zht_304 2009-10-06
  • 打赏
  • 举报
回复
看帖学习。只是为什么楼主消失无踪影。
鸵鸟 2009-10-06
  • 打赏
  • 举报
回复
拜一下carmack
stjay 2009-10-06
  • 打赏
  • 举报
回复
就像一个文件
其大小和占用的磁盘空间不一样
stjay 2009-10-06
  • 打赏
  • 举报
回复
sizeof(结构体)只是其 大小
只有其实例才会占用内存,
应该凡是和这个实例相关的内存都算在内吧

如(简单些,不包含像CString这样的成员)
struct s1
{
char *data;
};

占用内存:
1.
struct s1 st1;// 现在是sizeof(s1)
st1.data=(char*)malloc(100);//现在是不是sizeof(s1)+100?
情况和CString一样,初始化时是sizeof(CString),一旦CString实例被使用后,其占用内存变了

2.
struct s1 *st2;
st2=(s1*)malloc(sizeof(s1)*100);//这样呢?


平时都是常见结构体里定义的一些基本数据类型,应该属于C语言的结构体吧

不知哪条C/C++标准明确的定义了
结构体所占用的内存空间
iofomo 2009-10-06
  • 打赏
  • 举报
回复
这个只能够且最方便最高效的就是使用sizeof()了,19楼想法怪异,CString对象中除了字符数据还有其他数据成员的比如INT m_len,并且里面还有4个字节(32位)虚指针。
要弄清楚CString里面是什么数据成员才可以的。
2009-10-06
  • 打赏
  • 举报
回复
好像发散得越来越开了……还是先问下楼主到底要干什么吧……
Sandrer 2009-10-06
  • 打赏
  • 举报
回复
类似这样的结构体啊,我觉得手动地判断,一个成员一个成员地去算出它们占用的内存空间大小,然后求和,好像很麻烦。。我不知道有没有什么比较方便地办法可以求出一个结构体所占用的内存空间大小?


看来楼主的意图,并不是 sizeof 就能解决的!
他是想得到结构体中字符类里面的字符数量~~~~

要不就求和,要不就用像 TCHAR 那样的类型做数组来保存。

如果这结构提用作读写文件、网络传输的话,估计就会出错了!
  • 打赏
  • 举报
回复
sizeof()
Oo_Oo_ 2009-10-06
  • 打赏
  • 举报
回复
调试的时候能看到这个结构体的内存地址,内存地址都知道了,剩下的就算了
emailtome 2009-10-06
  • 打赏
  • 举报
回复
虽然你写的是 struct 但是不是 C 语言的 struct
24K純帥 2009-10-05
  • 打赏
  • 举报
回复
sizeof...up
whg01 2009-10-05
  • 打赏
  • 举报
回复
sizeof果然很流行。
有时候,话题展开了,就不是一两百字能说明白的。
aizibion 2009-10-05
  • 打赏
  • 举报
回复
[Quote=引用 25 楼 hpsmouse 的回复:]
引用 23 楼 aizibion 的回复:
引用 22 楼 ziyoufeng_ 的回复:
神奇个屁,CString里面的内存分配是他的事,在他内部还不是一个指针,所以CString对象的固定大小的,指针指向的内存算不进去的。


你认为求结构体得长度仅仅是用来打印在控制台?
如果它用来传输数据?如果它用来初始化内存?
这难道还不够神奇末?

你觉得你有可能直接访问到 CString 动态申请的空间吗?
传输数据?这是数据序列化的事,不经过序列化你敢直接把一个 CString 发过去?
初始化内存?除了类自己的空间你还要初始化什么内存?你要手动帮 CString 动态申请内存?
[/Quote]
兄台别激动,也被老拿CString 说事,我就想知道我们通常sizeof一个结构体得到得值会用来干什么,你觉得含有CString这种东西得sizeof值我们可以用来干什么?
2009-10-05
  • 打赏
  • 举报
回复
[Quote=引用 23 楼 aizibion 的回复:]
引用 22 楼 ziyoufeng_ 的回复:
神奇个屁,CString里面的内存分配是他的事,在他内部还不是一个指针,所以CString对象的固定大小的,指针指向的内存算不进去的。


你认为求结构体得长度仅仅是用来打印在控制台?
如果它用来传输数据?如果它用来初始化内存?
这难道还不够神奇末?
[/Quote]
你觉得你有可能直接访问到 CString 动态申请的空间吗?
传输数据?这是数据序列化的事,不经过序列化你敢直接把一个 CString 发过去?
初始化内存?除了类自己的空间你还要初始化什么内存?你要手动帮 CString 动态申请内存?
dongpy 2009-10-05
  • 打赏
  • 举报
回复
sizeof(RecvStruct),编译时就计算好了,并且是无符号整数。
aizibion 2009-10-05
  • 打赏
  • 举报
回复
[Quote=引用 22 楼 ziyoufeng_ 的回复:]
神奇个屁,CString里面的内存分配是他的事,在他内部还不是一个指针,所以CString对象的固定大小的,指针指向的内存算不进去的。
[/Quote]

你认为求结构体得长度仅仅是用来打印在控制台?
如果它用来传输数据?如果它用来初始化内存?
这难道还不够神奇末?
ziyoufeng_ 2009-10-05
  • 打赏
  • 举报
回复
神奇个屁,CString里面的内存分配是他的事,在他内部还不是一个指针,所以CString对象的固定大小的,指针指向的内存算不进去的。
aizibion 2009-10-05
  • 打赏
  • 举报
回复
有变长成员在其中,用sizeof估计要神奇了
hui12345685 2009-10-05
  • 打赏
  • 举报
回复
sizeof()
只不过可能不同的编译器结果会不同
stjay 2009-10-05
  • 打赏
  • 举报
回复
感觉LZ的想法是
sizeof(RecvStruct)+
m_Type.GetLength()+
m_Machine_ID.GetLength()+
m_TableName.GetLength()+
m_TimeStamp.GetLength()+
m_Content.GetLength()

这样的话,没什么简便方法。
加载更多回复(18)

64,654

社区成员

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

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