
C++
splayx
这个作者很懒,什么都没留下…
展开
-
extern连接发生在什么时候
extern的连接发生在编译时的连接阶段,但是看下面的代码中add()函数没有被调用,extern void add();int main() { return 0;} 此时没有定义add却没有编译问题,编译器的这个行为也不难理解。因为add没有被调用,所以没定义也没关系。 extern void add();int main() { ...原创 2013-03-19 21:47:08 · 224 阅读 · 0 评论 -
volatile使用
volatile可以限制编译器对变量的访问做优化,使得不利用CPU的缓存(寄存器),而到主内存中获得。 关于volatile的使用建议参考:http://yarchive.net/comp/linux/ACCESS_ONCE.html对于线程间共享的变量,如果没有lock保护,而且有可能改变的,都用ACCESS_ONCE(volatile)保护起来吧,#define...原创 2014-02-26 21:13:44 · 174 阅读 · 0 评论 -
sizeof和数组类型
sizeof(类型)可以得到一个类型的大小,比较容易搞错的是把数组类型看成指针类型,见下面的代码: #include <stdio.h>// error: cannot convert// ‘char*’ to ‘int*’ for argument ‘1’ to ‘void fun(int*)’// 可见a被看成指针,而不是一个数组类型// 所以这里...原创 2014-02-22 19:23:54 · 200 阅读 · 0 评论 -
无锁队列一(简单实现)
没多少行代码,先给出最终实现:template<typename T> class CAS { private:...原创 2013-08-24 21:43:42 · 174 阅读 · 0 评论 -
基本类型不用引用的原因
复杂的类型使用引用,可以减少拷贝而提高性能;如果不希望引用被修改则带上const标志。 但是对于简单类型,如果是处于性能原因而使用引用,那肯定是弄巧成拙的。因为使用引用之后,多了一些额外的索引标志,这些的带来的消耗在时间和空间上都比不用引用要多一些。使用gcc -S x.cpp -o x.s得到下列的代码的汇编的大小 int add(int a, int b) ...原创 2013-01-28 13:00:56 · 303 阅读 · 0 评论 -
static和const的使用
static 文件域+位置域(局部,类)在一个类中声明了,在类外定义,static变量定义时所在的文件,就构成了该变量的作用范围。一个类的static变量,如果在头文件中定义,多个其他文件include这个文件的时候,就会使得这个static有多个实体。也就是一个类定义了多个static变量,然后就会报错!因为这个变量的作用域是由文件,类两者确定的,通过文件那一关,却没...原创 2013-01-15 11:16:16 · 91 阅读 · 0 评论 -
整型之间的转换
这里说一下C的强类型转换,也是C++的static_cast。在小端的机器实验了一下,从位数多的类型(例如int64)转到位数少的类型(例如int32)是直接截取的,这种情形是十分简单明了的。不过不同环境底层的策略可能不大一样。 而反过来,从位数少的到位数多的,就稍微复杂一点,在我的实验环境中,例如从a到b,首先会判断a是不是有符号的,如果a是无符号的,那直接一个...原创 2013-01-12 20:39:14 · 258 阅读 · 0 评论 -
可变参函数的实现
C编译器通常提供了一系列处理这种情况的宏,以屏蔽不同的硬件平台造成的差异,增加程序的可移植性。这些宏包括va—start、va—arg和va—end等。 这些在stdarg.h中可以找到。 #define _INTSIZEOF(n) ((sizeof(n)+sizeof(int)-1)&~(sizeof(int) - 1) ) #...原创 2012-09-12 20:46:59 · 81 阅读 · 0 评论 -
linux管道编程
管道有自己的一套文件系统,它不映射到磁盘,而只是存在内存里。每个一个管道都有一个缓冲空间,大小因系统而异。ulimit -a | grep pipepipe size (512 bytes, -p) 8 管道的读写支持block特性。pipe的阻塞可以通过int fcntl(int fd, int cmd, ... /* arg */ )修改 ...原创 2013-05-12 16:08:03 · 110 阅读 · 0 评论 -
原子操作
内核自带的原子操作可以帮助高效地我们实现引用计数等功能。 介于这么一个前提,一个引用对象不可能同时被引用和删除。 以下可以简单地实现引用计数。 内核中的定义:typedef struct { int counter; } atomic_t;在复制构造函数(A::A(const A&)),和赋值构造函数(const A& A::operator=(co...原创 2012-11-24 17:42:02 · 83 阅读 · 0 评论 -
C++ 一些关键字的解释
auto在C++98/03中这个这个关键字用于声明块中的变量的生存期为自动生存期,这个关键字不常用,因为即便省略,声明的默认就是auto的。在C++11中,auto的含义改变为自动通过初值符推断声明的类型占位符。也可以使用auto& i等声明,具体推导规则同模版参数类型推导。 typeidtypeid(obj)返回的是type_info的一个引用,可以用ty...原创 2013-04-13 21:34:56 · 132 阅读 · 0 评论 -
构造函数的一个误解
先看一段代码。#include <iostream>using namespace std;class A {public: A() { cout << "A()" << endl; } ~A() { cout << "~A()" << e原创 2013-03-25 12:19:12 · 72 阅读 · 0 评论 -
虚函数的一些解释
C++的行为规定是,每个有虚函数的类,会有一张虚函数指针表,这张虚函数指针表指向最后实现的虚函数。用指向派生类的基类指针调用函数时就会访问这张表。从而体现了C++的多态技术,即指向派生类的基类指针可能有多种形态,编译器并不在编译阶段决定这类指针指向的函数的具体位置,而是在运行时通过查虚函数表的方式找到调用入口。 但是编译器也不是傻的,对于虚函数这一块可以做一些优化。...原创 2013-03-20 00:45:54 · 95 阅读 · 0 评论 -
打印调用栈
#include <execinfo.h>#include <stdlib.h>#include <stdio.h>#include <unistd.h>const int STACK_BUF_SIZE = 100;void *stack_buf[STACK_BUF_SIZE];void func3(void) {...原创 2014-03-18 19:30:58 · 131 阅读 · 0 评论