size_t类型传值时发生类型截断

有一个局部变量len是size_t类型的,一个函数第二个参数为int,size_t在64位环境下下为64bit,int在64为环境下为32bit,当len大于32bit的数值在传递时被截断,该怎么解决

size_t len = ByteSizeLong();
void* param = malloc(len);
SerializeToArray(param, len)  //此函数第二个形参为int

SerializeToArray函数是不可修改的呗?那估计很困难了。看这函数功能吧,能不能分批处理

那么为什么不用相同的数据类型?改不了代码还是什么?

这个是受限于 SerializeToArray 函数的参数类型,它只接受 int 类型的,要么就只能被截断,要么就是修改 SerializeToArray 的参数,包括里面的函数体。

可以把不能改的原因说一下。不过这里还有一个问题,就算把size t强制传进去了,引用的库也不一定能正确处理。
最好看是否能在写一个函数,把不能改的部分在包一层看能不能实现

size_t len = ByteSizeLong();
void* param = malloc(len);

func(param, size_t slen) 
{
    int len;
    len = xxxx;
    while(slen > 0) {
        SerializeToArray(param, len);
        slen -= len;
}

如果啥都不能改,哪位哥看知不知道修改编译器去对齐字节了。

函数功能能不能分批处理

可以参考这篇博文中的分析思路,重点介绍了【32位、64位移植需注意的问题】
链接:https://blog.csdn.net/xt18971492243/article/details/80945195?spm=1001.2101.3001.6661.1&utm_medium=distribute.pc_relevant_t0.none-task-blog-2%7Edefault%7ECTRLIST%7ERate-1-80945195-blog-82693675.pc_relevant_default&depth_1-utm_source=distribute.pc_relevant_t0.none-task-blog-2%7Edefault%7ECTRLIST%7ERate-1-80945195-blog-82693675.pc_relevant_default&utm_relevant_index=1

参考一下以下链接

修改 SerializeToArray 的参数,它涉及到的自定义函数部分也需要改

你SerializeToArray是不能修改的么?不能修改,就只能分批处理了,不然你就得修改SerializeToArray函数了

  1. 使用32位编译
  2. 如果使用64位编译,先分析ByteSizeLong()是否存在返回值大于2GB的可能性,如果没有,则可以忽略截断警告;如果有,那么你需要把数据按最大2GB进行划分,然后分批调用SerializeToArray

如果没人会的话我来试试