随笔分类 -  learning C++

记录C++学习中的内容
摘要:STL 如何对STL进行扩展,简单小结 前言 本文为:《STL源码分析》阅读之后的小结。 主要的扩展方式是,按照特定的规则定义一个容器,一个迭代器。 定义一个迭代器 迭代器需要构造的类型有 value_type difference_type reference pointer iterator_c 阅读全文
posted @ 2020-10-26 16:45 grassofsky 阅读(237) 评论(0) 推荐(0) 编辑
摘要:STL - 容器内存存储结构 前言 本文为:STL源码分析第四章《sequence containers》和第五章《associated container》的阅读记录。 vector vector的使用参见:http://www.cplusplus.com/reference/vector/vec 阅读全文
posted @ 2020-10-14 09:16 grassofsky 阅读(515) 评论(0) 推荐(1) 编辑
摘要:STL - 内存分配 - 内存池 前言 本文为:STL源码分析第二章《allocator》的阅读记录。 如果具有很多小额区块的内存分配,那么采用直接分配的方式,不仅会产生很多的碎片内存,对这些空间进行管理也会带来额外的负担。 文中记录的方法是,如果区块够大,超过128bytes,就向系统直接申请对应 阅读全文
posted @ 2020-09-18 11:32 grassofsky 阅读(582) 评论(0) 推荐(0) 编辑
摘要:可以先看下:STL - 内存分配 - 内存池 程序中有个生存周期和进程一样长的变量,ngx_cycle_t。这个类型的变量会从父进程传递给子进程。 该类型中与共享内存相关的变量为: // file: ngx_cycle.h struct ngx_cycle_s { ... ngx_list_t sh 阅读全文
posted @ 2020-09-18 09:35 grassofsky 阅读(220) 评论(0) 推荐(0) 编辑
摘要:读《C++ API设计》 API简介 API是软件组织的逻辑接口,隐藏了实现这个接口所需的内部细节。 + + | | | Second Life Viewer | 应 用 程 序 代 码 | | + + + + + + + + | | | | | | | IICommon | | IIMessage 阅读全文
posted @ 2020-09-17 20:11 grassofsky 阅读(1603) 评论(0) 推荐(0) 编辑
摘要:C++/CLI for C# programmer使用基本指南 该文涉及的内容如下: C++基本语法 VS中创建C++项目 VS C++项目属性介绍 C++/CLI介绍 VS中创建C++/CLI项目 C++基本语法 // cppclass.h #ifndef _CPP_CLASS_H_ #defin 阅读全文
posted @ 2020-09-17 20:08 grassofsky 阅读(681) 评论(0) 推荐(0) 编辑
摘要:C++ 创建动态属性 功能清单 支持属性动态添加,如: Properties p; p.Add<int>("age", 10); // 属性名称用枚举,或者字符串 int age = p.Get<int>("age"); 支持查看属性是不是有更新,如: p.IsDirty<int>("age"); 阅读全文
posted @ 2020-09-16 17:25 grassofsky 阅读(1221) 评论(0) 推荐(0) 编辑
摘要:C++ string double互转精度问题 double转化为string,可以参见:https://www.cnblogs.com/chorulex/p/7660187.html。 string转化为double,可以参见:http://www.cplusplus.com/reference/ 阅读全文
posted @ 2020-07-15 19:44 grassofsky 阅读(4763) 评论(0) 推荐(0) 编辑
摘要:1. const指针总是指向相同的地址,该地址是不能被改变的. 1: int nValue = 5; 2: int *const pnPtr = &nValue;*pnPtr = 6; 这样的操作是可行的;而 int nValue2 = 2; pnPtr = &nValue2;这样的操作是不可行的。int *const pnPtr 可以这么理解,pnPtr当作地址,该指针有const地址,并且指向一个整型变量。2. 指向const变量(虽然这个变量本身可以不是const的)的指针 1: int nValue = 5; 2: const int *pnPtr = &nVa 阅读全文
posted @ 2012-05-22 20:48 grassofsky 阅读(169) 评论(0) 推荐(0) 编辑
摘要:摘要:举了几个动态内存分配过程中,发生内存泄漏的例子1. 分配了内存,却没有及时删除,导致泄漏 1: void doSomething() 2: { 3: int *pnValue = new int; 4: }2. 为指针变量分配了一个内存,然后又让指针变量指向其他的值,导致泄漏 1: int nValue = 5; 2: int *pnValue = new int; 3: pnValue = &nValue; // old address lost, memory leak results3. 连续分配了两次内存,第一次分配的内存由于没有delete,... 阅读全文
posted @ 2012-05-22 20:47 grassofsky 阅读(246) 评论(0) 推荐(0) 编辑
摘要:先来看一下一段代码: 1: char szString[255]; 2: cin >> szString; 3: cout << “You entered: ”<< szString << endl;这段代码在c++程序中是很常见的,但仔细想一下如果你输入的字符串长度大于255,就会出现溢出的现象,也许这个问题通常会被人忽略。其实我们可以选择一个更好的实现方法,如下 1: char szString[255]; 2: cin.getline(szString, 255); 3: cout << "Your entered: 阅读全文
posted @ 2012-05-22 20:46 grassofsky 阅读(214) 评论(0) 推荐(0) 编辑
摘要:from http://www.learncpp.com/cpp-tutorial/59-random-number-generation/通常在游戏,统计模型程序和科学模拟中会用到随机事件。而由于计算机的本质结构决定计算机只能生成伪随机数据。伪随机生成器,设定一个初始值(seed),对它进行操作形成不同的数值,让它看上去与初始值没有联系。如果算法足够复杂,将同样的算法用到最后生成的数字,这样就能够产生一些列看上去随机的数值。下面是一个产生100个伪随机数的程序:1. 1: #include <stdafx.h> 2: #include <iostream> 3: us 阅读全文
posted @ 2012-05-22 20:45 grassofsky 阅读(293) 评论(0) 推荐(0) 编辑
摘要:from http://www.learncpp.com/cpp-tutorial/44-type-conversion-and-casting/类型隐式转换类型隐式转换的步骤如下所示:Long double (highest)DoubleFloatUnsigned long intLong intUnsigned intInt (lowest) 最底层是int而不是short或是char,是因为char和short在求值时会被扩展为int。隐式转换会出现一些有趣的问题,如5u - 10。也许你会认为结果是-5.但是10为int型,发生隐式转换成unsigned int型,因此最后结果为uns 阅读全文
posted @ 2012-05-22 20:44 grassofsky 阅读(159) 评论(0) 推荐(0) 编辑
摘要:from http://www.learncpp.com/cpp-tutorial/38-bitwise-operators/位操作符的由来主要是为了更充分的利用内存,如果使用bool型变量,它是一个字节大小,其中一个字节的内存中只有一个位被利用,其余的位都被浪费了。但是现在内存是充裕的,程序员发现往往将代码表达的更加让人理解,更加容易维护是一种更好的选择。因此,位操作符的使用不再像最初那么平常了,除了一些特殊的环境中,如需要巨型数据处理的科学计算,或需要超速执行的游戏中,仍然会被使用。不管怎么样,对它有个充分的认识和理解还是必须的。OperatorSymbolFormOperationlef 阅读全文
posted @ 2012-05-22 20:43 grassofsky 阅读(265) 评论(0) 推荐(0) 编辑
摘要:from http://www.learncpp.com/cpp-tutorial/37-converting-between-binary-and-decimal/有符号二进制数最左边一位是符号位,0表示正,1表示负。有符号正数的存储方式与非符号数相同,负数的存储方式是相应的正数求反加1.如-76.其二进制是:0100,1100取逆:1011,0011加1:1011,0100为什么需要加一呢,让我们来看一下0,正数时0000,0000,取逆1111,1111。若不加1,0正负值有两种表述方式,因此通过加1的方式,使得0的表述唯一。 阅读全文
posted @ 2012-05-14 11:29 grassofsky 阅读(485) 评论(0) 推荐(0) 编辑
摘要:from http://www.learncpp.com/cpp-tutorial/36-logical-operators/逻辑操作符使用的过程中需要注意的有:1. 将&&和||操作符混合使用时,应该清除地认识到两者的优先级是有差异的,&&的优先级高于||的优先级。所以当你需要一个逻辑判断顺序执行时,如 nValue1 || nValue2 && nValue3,因为你忽略了优先级的不同,它实际执行情况将如下:nValue1 || (nValue2 && nValue3)而不是(nValue1 || nValue2) & 阅读全文
posted @ 2012-05-14 11:10 grassofsky 阅读(142) 评论(0) 推荐(0) 编辑
摘要:from http://www.learncpp.com/cpp-tutorial/35-relational-operators-comparisons/关系运算符的比较需要注意的就是浮点型数值的比较。小的舍入的误差可能会造成预料之外的结果。特别是在比较两个浮点数是否相等的情况下,使用==操作符进行比较就不被建议使用的。一种常用的解决方法是,考虑当两个数足够接近时,就认为它们是相等的。 1: bool IsEqual(double dX, double dY) 2: { 3: const double dEpsilon = 0.000001; // or some oth... 阅读全文
posted @ 2012-05-14 10:49 grassofsky 阅读(177) 评论(0) 推荐(0) 编辑
摘要:from http://www.learncpp.com/cpp-tutorial/34-sizeof-comma-and-arithmetic-if-operators/sizeofOperatorSymbolFormOperationSizeofsizeofsizeof(type)sizeof(variable)Returns size of type or variable in bytessizeof操作符返回以字节为单位的变量或是类型的大小。如: 1: #include <iostream> 2: 3: int main() 4: { 5: using... 阅读全文
posted @ 2012-05-14 10:36 grassofsky 阅读(211) 评论(0) 推荐(0) 编辑
摘要:from http://www.learncpp.com/cpp-tutorial/33-incrementdecrement-operators-and-side-effects/一个变量自增1与自减1是如此的平常,以至于在C中它们有了自己的操作符。每一个操作符都有两个版本——前缀与后缀。OperatorSymbolFormOperationPrefix increment++++xIncrement x, then evaluate xPrefix decrement––––xDecrement x, then evaluate xPostfix increment++x++Evaluat 阅读全文
posted @ 2012-05-12 09:08 grassofsky 阅读(267) 评论(0) 推荐(0) 编辑
摘要:from http://www.learncpp.com/cpp-tutorial/32-arithmetic-operators/一元算术操作符有两种一元算术操作符,+和-。一元操作符只进行一次操作OperatorSymbolFormOperationUnary plus++xValue of xUnary minus--xNegation of x为了获得最好的效果,这些操作符最好与操作对象紧挨在一起(如,-x,不是- x)。不要将一元减操作符和二元减操作符相混淆。如x = 5 - -3;。二元操作符这里有5中二元算术操作符OperatorSymbolFormOperationAdditi 阅读全文
posted @ 2012-05-11 21:27 grassofsky 阅读(267) 评论(0) 推荐(0) 编辑

点击右上角即可分享
微信分享提示