C++调用redis Ping Pong测试失败

在使用hiredis的静态库的时候,vs监视器能看到redisReply中返回的值能看到str和len,但是通过memcpy到char数组中,出现异常。

定位字节对齐的问题。因为两个结构体中字段占用的内存分配是不匹配的,直接进行memcpy一定会导致字段值错误。(redis静态库中编译使用了按照1字节对齐,使用静态库的函数对齐方式是编译器的默认对齐方式,4字节对齐)

为要设置的对齐大小,windows下可以设置为1,2,4,8,16,linux中g++只能是1,2,4


字节对齐的作用:

字节对齐的作用不仅是便于cpu快速访问,同时合理的利用字节对齐可以有效地节省存储空间。对于32位机来说,4字节对齐能够使cpu访问速度提高,比如说一个long类型的变量,如果跨越了4字节边界存储,那么cpu要读取两次,这样效率就低了。但是在32位机中使用1字节或者2字节对齐,反而会使变量访问速度降低。所以这要考虑处理器类型,另外还得考虑编译器的类型。在vc中默认是4字节对齐的,GNU gcc 也是默认4字节对齐。

更改编译器字节对齐的两种方式:


#pragma pack (n)  / #pragma pack (),C编译器将按照n个字节对齐 / 取消设置。

 __attribute((aligned (n))),让所作用的结构成员对齐在n字节自然边界上。如果结构中有成员的长度大于n,则按照最大成员的长度来对齐。__attribute__ ((packed)),取消结构在编译过程中的优化对齐,按照实际占用字节数进行对齐。

#pragma pack(show)来通过警告的方式来显示当前的对齐大小

你可能感兴趣的:(C++调用redis Ping Pong测试失败)