C++学习记录

一、C++字节对齐

(1)#pragma pack (push,n)与#pragma pack(pop)的区别

#pragma pack (push,n)    // 把原来对齐方式设置压栈,并设新的对齐方式为n个字节对齐
#pragma pack(pop)        // 恢复原来对齐方式

从上面两点来看#pragma pack(n)与#pragma pack (push,n)来看,他们之间的区别并不大,可以相互代替,只是后者恢复时是恢复到了原来的对齐方式,而前者是恢复到了编译器默认的对齐方式。推荐使用后者。

(2)最近在写代码的时候,,因为引用了一个头文件, 导致系统莫名奇妙的崩,最后发现是#pragma pack(n)的问题,千万不要写一半, 不然真的太危险了。对齐之后一定要恢复对齐状态,否则会有意外的问题。

#pragma pack(push) //保存对齐状态
#pragma pack(4)//设定为4字节对齐
struct test
{
    char m1;
    double m4;
    int m3;
};
#pragma pack(pop)//恢复对齐状态


或者

#pragma pack(push,4) //保存对齐状态
struct test
{
    char m1;
    double m4;
    int m3;
};
#pragma pack(pop)//恢复对齐状态

 

二、动态库导出模板类或模板函数

       有两个方法可以在动态库中导出模板类或函数

(1)模板类必须在header中实现,而不能在cpp中实现,定义和实现都在类中。否则作为dll调用进行链接的时候回出错。

(2)或者申明在头文件中,实现在源文件,但是在头文件的最后包含源文件。

(3)在头文件中申明,在源文件中实现,但是只能实例化你需要的几种类型。

参考:如何在动态链接库dll/so中导出自定义的模板类template class_kezunlin的博客-CSDN博客

 

三、两个unsigned char的字符相加转成std::string

// 将 '\x3' 转换成 '3'  
unsigned char aa = '\x3'+ '0';
unsigned char bb = '\x4' + '0';
// 将两个 unsigned char 相加
unsigned char sum = aa + bb;
//它的内部实现是在底层分配内存,将字符aa复制到这个内存中,并在字符串末尾添加null终止符,形成一个以aa为内容的字符串。
std::string ddd = std::string(1, aa) + "." + std::string(1, bb);  //"3.4"

//第二种方法:
unsigned char aa = '3';
unsigned char bb = '4';
// 将两个 unsigned char 相加
unsigned char sum = aa + bb;
std::string ddd = std::string(1, aa) + "." + std::string(1, bb);  //"3.4"

在C++中,字符 '3' 和 '\x3' 表示的是两种不同的字符,'3' 表示的是 ASCII 字符 '3',它的 ASCII 值是 51(十进制),'\x3' 表示的是十六进制值为 3 的字符,对应的是 ASCII 控制字符 "End of Text"。std::string(1, char1) 这个表达式的内部实现是通过 std::string 的构造函数来完成的。具体而言,这个构造函数有多个重载形式之一可以接受一个字符以及一个重复次数。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值