计算一个接口的返回值大小(占用内存)

本文介绍了不同编码方式下字符与字节的关系,包括ASCII、UTF-8、Unicode等编码方式的特点,并通过实验展示了不同编码方式下汉字占用的空间大小。

          String str="您的返回类型是1001";
System.out.println(str.length());
System.out.println(str.getBytes().length);


 UTF-8编码中,一个英文字符等于一个字节,一个中文(含繁体)等于三个字节。

所以结果如下

11

25


用一个txt文档做实验
1000个汉字---utf-8编码格式---占用2.95k,接近3k。这是因为utf-8编码格式下1000个字符占3000字节,相当于3000B,接近3k

参考: http://blog.youkuaiyun.com/liwenxia626/article/details/70808958

(一)“字节”的定义

字节(Byte)是一种计量单位,表示数据量多少,它是计算机信息技术用于计量存储容量的一种计量单位。


(二)“字符”的定义

字符是指计算机中使用的文字和符号,比如1、2、3、A、B、C、~!·#¥%……—*()——+、等等。


(三)“字节”与“字符”

它们完全不是一个位面的概念,所以两者之间没有“区别”这个说法。不同编码里,字符和字节的对应关系不同:

ASCII码中,一个英文字母(不分大小写)占一个字节的空间,一个中文汉字占两个字节的空间。一个二进制数字序列,在计算机中作为一个数字单元,一般为8位二进制数,换算为十进制。最小值0,最大值255。

UTF-8编码中,一个英文字符等于一个字节,一个中文(含繁体)等于三个字节。

Unicode编码中,一个英文等于两个字节,一个中文(含繁体)等于两个字节。

符号:英文标点占一个字节,中文标点占两个字节。举例:英文句号“.”占1个字节的大小,中文句号“。”占2个字节的大小。

UTF-16编码中,一个英文字母字符或一个汉字字符存储都需要2个字节(Unicode扩展区的一些汉字存储需要4个字节)。

UTF-32编码中,世界上任何字符的存储都需要4个字节。


字节 (byte):8个二进制位为一个字节(B),最常用的单位。计算机存储单位一般用B,KB,MB,GB,TB,PB,EB,ZB,YB,BB来表示,它们之间的关系是:
  1B(Byte字节)=8bit
  1KB (Kilobyte 千字节)=1024B,
  1MB (Mega byte 兆字节 简称“兆”)=1024KB,
  1GB (Giga byte 吉字节 又称“千兆”)=1024MB,
  1TB (Tera byte 万亿字节 太字节)=1024GB,其中1024=2^10 ( 2 的10次方)

用一个txt文档做实验
1000个汉字---utf-8编码格式---占用2.95k,接近3k。这是因为utf-8编码格式下1000个字符占3000字节,相当于3000B,接近3k。
---asci编码格式下,2k
---unicode编码格式下,2k

在C++中,序列化对象之前预先计算其序列化后的大小一个常见的需求,尤其是在需要分配合适大小的缓冲区或者优化内存使用时。Protocol Buffers 提供了相关的接口来实现这一功能。 使用 `ByteSizeLong()` 方法可以预先计算一个 Protocol Buffer 对象在序列化后的字节大小[^3]。该方法返回的是一个 `size_t` 类型的值,表示对象序列化后的预期大小。通过这个方法,可以在实际序列化操作之前分配合适大小的缓冲区,从而避免不必要的内存重新分配和复制操作。 以下是一个使用 Protocol Buffers 在 C++ 中预先计算序列化大小的示例: ```cpp #include <iostream> #include <string> #include "your_proto_file.pb.h" // 替换为你的 .proto 文件生成的头文件 int main() { // 创建一个对象并填充数据 YourMessage message; message.set_version("1.0"); // 预先计算序列化后的大小 size_t serialized_size = message.ByteSizeLong(); std::cout << "Serialized size: " << serialized_size << " bytes" << std::endl; // 分配足够大小的缓冲区 std::string buffer; buffer.resize(serialized_size); // 序列化对象到缓冲区 if (message.SerializeToArray(buffer.data(), buffer.size())) { std::cout << "Serialization successful." << std::endl; } else { std::cerr << "Serialization failed." << std::endl; } return 0; } ``` 在上述代码中,`ByteSizeLong()` 方法用于计算对象的序列化大小,接着使用 `std::string::resize` 来分配合适大小的缓冲区,最后调用 `SerializeToArray` 将对象序列化到该缓冲区中。 这种方法在资源受限的环境中特别有用,因为它可以减少动态内存分配的次数,提高程序的性能和效率。此外,如果你使用的是 `LITE_RUNTIME` 优化级别,则生成的代码不仅运行效率高,而且占用的空间也非常少,这对于内存受限的平台(如移动设备)尤为重要[^3]。 ### 相关问题 1. Protocol Buffers 中 `ByteSizeLong()` 方法的返回值是否总是准确的? 2. 在 C++ 中,除了使用 `ByteSizeLong()`,还有哪些方法可以计算对象序列化后的大小? 3. 使用 Protocol Buffers 的 `SerializeToArray` 和 `SerializeToOstream` 之间有什么区别? 4. 如何在 C++ 中高效地序列化和反序列化 Protocol Buffer 对象? 5. 如果在序列化之前没有正确计算大小并分配足够的缓冲区,会发生什么问题?
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值