C++
Shonm
用blog记录点点滴滴。。。成长的轨迹一步一个印
展开
-
链接重定义错误
转自:http://hi.baidu.com/weitingwang/item/d9de9ae8f581f4e8fb42ba5eVS2005链接问题: LNK2005错误 :error LNK2005: _free 已经在 libcmtd.lib(dbgheap.obj) 中定义以前经常遇到这个警告信息,因为运行并没有什么问题,所以也没深究。但是耿耿于怀那个“ 0转载 2014-05-23 16:19:31 · 1075 阅读 · 0 评论 -
STL内存管理
这些天在看内存的分配管理的知识,可以参考前面写的文章:linux内存分配管理实现自己的malloc STL是一套非常高效的C++库,提到内存管理,怎么能少了他呢,花了近一天的时间来剖析这个。STL内存分配分为两级,为什么分为两级,就比如你为了买一根普通的皮带,去汉正街批发市场,别人不一定卖给你(亲身经历)。只有一次性购买大量的货才会去批发市场,商家才会和你做生意。内存分配也是这...原创 2019-01-25 14:43:16 · 911 阅读 · 2 评论 -
google protobuf 序列化,反序列化例子
proto文件为:package tutorial;message Person { required string name = 1; required int32 id = 2; optional string email = 3; } 用四种方式简单的展示了protobuf序列化和反序列化的例子:#include <iostream>#i...原创 2018-11-07 21:57:20 · 1176 阅读 · 0 评论 -
google protobuf 反射的例子
反射就是可以知道一个对象自身的数据属性,例如有哪些字段,字段的值,函数等等。下面的代码展示了protobuf 对象反射的例子。将一个对象按照反射的字段顺序序列化到string,然后反序列化到对象。最后调用反射打印其字段值,可以看到对象能够还原。proto文件为(暂时不支持数组):package tutorial;message Person { required string ...原创 2018-11-10 17:02:27 · 396 阅读 · 0 评论 -
c struct结构体分段
看代码中发现了一段一时间能理解(N年的老司机猜也能猜到了)但是又不太确定的代码:union SID { SID(uint32_t sid) : sid_(sid) {} struct { uint32_t game_id_:16; uint32_t role_idx_:16; }; uint32_t sid_;};...原创 2018-10-15 21:50:16 · 593 阅读 · 0 评论 -
boost 多索引容器multi_index_container
在游戏开发中遇到了boost的multi_index_container,中文翻译为多索引容器。那什么是多索引容器呢?为什么使用他?如何使用他?下面就一一介绍。想必大家在实际开发中一定多多少少会遇到以下的问题,我需要创建一个map,并且需要两种方式去索引,比如:创建一个<学号,姓名>的map,但是我既需要用学号去索引,又需要用姓名去索引,但std::map只能用它的key_type...原创 2018-09-26 19:27:07 · 1312 阅读 · 0 评论 -
C语言变长数组data[0]【总结】
1、前言 今天在看代码中遇到一个结构中包含char data[0],第一次见到时感觉很奇怪,数组的长度怎么可以为零呢?于是上网搜索一下这样的用法的目的,发现在linux内核中,结构体中经常用到data[0]。这样设计的目的是让数组长度是可变的,根据需要进行分配。方便操作,节省空间。2、data[0]结构经常遇到的结构形状如下:struct buffer{ int...转载 2018-09-09 21:00:42 · 290 阅读 · 0 评论 -
typename的起源与用法
typename的起源与用法侯捷在Effective C++的中文版译序中提到:C++的难学,还在于它提供了四种不同(但相辅相成)的程序设计思维模式:procedural-based, object-based, object-oriented, generics对于较少使用最后一种泛型编程的我来说,程序设计基本上停留在前三种思维模式当中。虽说不得窥见高深又现代转载 2017-02-23 22:05:24 · 1126 阅读 · 0 评论 -
C/C++结构体内存对齐
C/C++类/结构体内存遵循三个原则:c++中结构跟类几乎相同,除了默认成员的访问控制不同。以下结构体的内存对齐在类class中也是一样的。结构体变量的首地址能够被其最宽基本类型成员的大小所整除; 结构体每个成员相对于结构体首地址的偏移量(offset)都是成员自身大小的整数倍,如有需要编译器会在成员之间加上填充字节(internal adding); 结构体的总大小为结构体最宽基本类...转载 2014-09-19 16:45:14 · 638 阅读 · 0 评论 -
static_cast, dynamic_cast, reinterpret_cast, const_cast区别比较
隐式转换(implicit conversion)short a=2000;int b;b=a;short是两字节,int是四字节,由short型转成int型是宽化转换(bit位数增多),编译器没有warning,如下图所示。宽化转换(如char到int,int到long long,int到float,float到double,int到double等)构成隐式转换,转载 2014-07-24 21:39:44 · 642 阅读 · 0 评论 -
memcpy memmove区别和实现
memcpy与memmove的目的都是将N个字节的源内存地址的内容拷贝到目标内存地址中。但当源内存和目标内存存在重叠时,memcpy会出现错误,而memmove能正确地实施拷贝,但这也增加了一点点开销。memmove的处理措施:(1)当源内存的首地址等于目标内存的首地址时,不进行任何拷贝(2)当源内存的首地址大于目标内存的首地址时,实行正向拷贝(3)当源内存转载 2014-07-24 21:41:04 · 620 阅读 · 0 评论 -
VS2008中Run-Time Check Failure #2 - Stack around the variable 'xxx' was corrupted 错误解决方法
问题 :在用VS2008写一段代码,算法都没有问题,但是调试的时候发现出了main之后就报 Stack around the variable 'xxx' was corrupted 的错误,后来发现是数组越界造成的。测试下面类似情形的代码:#include using namespace std; int main() { int转载 2014-05-23 17:29:14 · 1229 阅读 · 0 评论 -
C++11 lambda函数
用过脚本语言的童鞋都知道,函数的定义可以在任何地方,例如:local function table_sort(t) local function sort_by_len(t1, t2) return #t1 < #t2 end table.sort(t, sort_by_len) --上面的代码也可以简写为:...原创 2019-06-14 15:34:35 · 2087 阅读 · 2 评论