有一个局部变量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;
}
如果啥都不能改,哪位哥看知不知道修改编译器去对齐字节了。
函数功能能不能分批处理
修改 SerializeToArray 的参数,它涉及到的自定义函数部分也需要改
你SerializeToArray是不能修改的么?不能修改,就只能分批处理了,不然你就得修改SerializeToArray函数了
ByteSizeLong()
是否存在返回值大于2GB的可能性,如果没有,则可以忽略截断警告;如果有,那么你需要把数据按最大2GB进行划分,然后分批调用SerializeToArray
如果没人会的话我来试试