摘要:
写了一个小程序,测试了一下vector是如何分配内存的: Code: Select all#include <iostream>#include <vector>#include <string>using namespace std;int main(){ vector<string> vec1; cout << "Vector size is: " << vec1.size() << ", capacity is: " << vec1.capacity() 阅读全文
摘要:
第八章有个例子,非常简单,就是读入用户输入,赋给一个int,这里面有一个判断,就是如果用户输入的不是int,那么,cin就会变成invalid,里面就有condition state,于是我们可以catch这个state并clear,然后继续读入。 但是书上给的例子有个错误,原来的程序是这样的: Code: Select all#include <iostream>#include <stdexcept>using namespace std;int main(int argc, char **argv){ int ival; // cout << &quo 阅读全文
摘要:
区别很简单,看这两个函数的man手册就能看的出来。简单来说,memmove是把一堆byte从src移到dst,memcpy是把一堆byte从 src拷贝到dst,最大不同的是:memmove是先把一堆byte拷贝到一个临时的array中,然后再把这个临时的array写到dst中去;而 memcpy没有这个逻辑,直接就是从src一个一个字节的读,同时往dst一个一个字节的写。这样就导致了一个最根本的不同: memcpy不适合或者说不能处理src和dst两块内存有重叠(overlap)的情况。因为memcpy是直接从src拷贝,然后往dst中写,这样,如果src和dst两块内存有重叠,这样就会导致 阅读全文
摘要:
在看lftp的源代码的时候,看到了程序的一开头有这样几句代码: setlocale (LC_ALL, ""); setlocale (LC_NUMERIC, "C"); bindtextdomain (PACKAGE, LOCALEDIR); textdomain (PACKAGE); 注:PACKAGE, LOCALEDIR都是宏,在autoconf的时候自动生成,PACKAGE宏就是lftp, LOCALEDIR就是/usr/share/locale 不明白有什么用,于是查了一下资料,写了一个测试程序,搞明白了。 setlocale是用来设置程序的l 阅读全文
摘要:
在看lftp的源代码的时候,发现这么一行: operator bool() const { return ... } 一下子没想起来,这是什么语法,是operator overload么?不像阿,怎么不以函数的返回值打头呢?后来一查C++ Primer,明白了,这是convert operator,也就是将这个类如果要转化成bool值的话,就会调用到这个函数。convert operator以operator关键字打头,紧跟类型,然后是两个括号(括号中不能带有参数)。更具体的看C++ Primer和上面的注释。 不过看明白了之后有个问题: operator int() const { .... 阅读全文
摘要:
来自interview的一个考题,所以写了一个测试程序来demonstrate一下。 func是一个函数指针,该函数返回值是int,没有输入参数;然后主程序中声明了一个函数指针myFuncPointer,该函数指针代表的函 数输入参数是一个int,返回值也是一个函数指针,类型就是func类型的。所以我们可以把func2这个函数赋给myFuncPointer这个指针。 interview的题目要的就是myFuncPointer这个指针的声明。 #include<stdio.h>typedefint(*func)();intfunc3(){printf("Infunction 阅读全文
摘要:
1.classA{public:A(){func(0);};virtualvoidfunc(intdata){printf("A1:%d\n",data);}virtualvoidfunc(intdata)const{printf("A2:%d\n",data);}voidfunc(char*str){printf("A3:(%s)\n",str);}};classB:publicA{public:voidfunc(){printf("B1:%s\n","");}voidfunc(intdata 阅读全文
摘要:
在gstreamer的源码中,看到了GST_BOILERPLATE_FULL宏的定义,原来在这个宏中就定义着_base_init, _init, _class_init这些函数的原型,难怪我们的源码中不需要定义这些函数原型呢,而且这个宏中最重要的就是可以说明我们的plugin是继承自哪个 class的(看GObject的相关内容),而且这个宏最重要的就是调用了gst_type_register_static_full函数,将 _base_init, _init, interface等等这些内容全部注册进了gstreamer。 OK,在这个宏的定义部分,就看到了##这样的代码,这是什么意思?这其 阅读全文
摘要:
printf, g_message这些函数中,使用 %lld 就可以打印一个unsigned long long了,glib中的guint64就是unsigned long long。这是GNU编译器支持的。在微软的编译器中,使用%lld, %I64都可以。 阅读全文
摘要:
rtspplayer这个程序在手机上运行的时候,要使用fbsink来作为video sink组件。这是使用了framebuffer的一个video sink组件。所以在代码中,很自然只需要在gst_element_factory_make的时候将xvimagesink换成fbsink就可以 了。但是程序在scratchbox中编译了之后,传到了手机上,运行却发生错误,报告说: No such element ...... `fbsink' 奇怪的是在手机上使用alp-gst-inspect|grep "fbsink"却能查到这个element。后来才知道,fbsin 阅读全文
摘要:
共享库的初始化和~初始化函数分析 转载时请注明出处:http://blog.csdn.net/absurd/ Win32下可以通过DllMain来初始化和~初始化动态库,而Linux下则没有与之完全对应的函数,但可以通过一些方法模拟它的部分功能。有人会说,很简单,实现_init/_fini两个函数就行了。好,我们来看看事实是不是这样的。 很多资料上都说可以利用_init/_fini来实现,而我从来没有测试成功过,原因是这两个函数都已经被gcc占用了。比如: test.c Code: Select all#include <stdio.h> void _init(void){ pri 阅读全文
摘要:
diff -u -d xxx xxx 即可 可以再加-r,这样就可以直接针对两个目录做diff比较,也就是diff -u -d -r <dir A> <dir B> 阅读全文
摘要:
RTM: inet_aton() doesn't appear to support IPv6, inet_pton does. The parameter lists are different. The return values are different. inet_pton() requires a four part dot notation and inet_aton can process some other presentation formats. Don't be surprised that you will encounter similar and 阅读全文
摘要:
How to generate coredump file and debug it in gdb 1. ulimit -a 可以查看当前所有的limit 2. ulimit -c用来设置coredump。比如:ulimit -c unlimited,就设置不限制生成的coredump文件的大小。也可以ulimit -c 1024,这样就设置了coredump文件大小不超过1M。 3. 运行程序crash之后,core文件生成。此时: gdb <program> <corefile> 或者直接运行gdb,然后在gdb的命令行中输入:core <corefile&g 阅读全文
摘要:
性能测试中,Tester程序由start.sh脚本来启动。现在的需求是:用户按下ctrl-c,程序能graceful退出,从而不用重启板子。问题 是:ctrl-c产生信号SIGINT,但是这个信号是传递给脚本进程的,不是传递给Tester进程的。所以这里就存在一个信号传递的问题。解决办法如 下: 1. 在脚本中加入代码: Code: Select allforward_sigint(){ # check out the tester's pid testerpid=$(cat /tmp/tester.pid) kill -2 $testerpid # call analyser and 阅读全文
摘要:
ignore SIGCHLD信号的作用 -- 防止僵尸进程的产生 signal(SIGCHLD, SIG_IGR); //忽略SIGCHLD信号,这常用于并发服务器的性能的一个技巧 //因为并发服务器常常fork很多子进程,子进程终结之后需要 //服务器进程去wait清理资源。如果将此信号的处理方式设为 //忽略,可让内核把僵尸子进程转交给init进程去处理,省去了 //大量僵尸进程占用系统资源。(Linux Only) Code: Select allsome code();pid = fork(); //生成一个子进程if (pid < 0) // error check. hand 阅读全文
摘要:
#include<stdio.h>#include<string.h>intmain(){chara;memset(&a,0xff,1);if(a==0xff)printf("Equal.\n");elseprintf("Notequal.\n");return0;}答案是不相等。可以用gdb来看,a变量在内存中的确是0xff,因为使用memset设置的。但是,由于a的类型是char,最大只能到0x7f,所 以,在做==比较的时候,0xff已经超过了char语义上的限制,所以,相等不成立。如果a是unsigned char 阅读全文
摘要:
格式: x /nfu <addr>说明x 是 examine 的缩写n表示要显示的内存单元的个数f表示显示方式, 可取如下值x 按十六进制格式显示变量。d 按十进制格式显示变量。u 按十进制格式显示无符号整型。o 按八进制格式显示变量。t 按二进制格式显示变量。a 按十六进制格式显示变量。i 指令地址格式c 按字符格式显示变量。f 按浮点数格式显示变量。u表示一个地址单元的长度b表示单字节,h表示双字节,w表示四字节,g表示八字节Format letters are o(octal), x(hex), d(decimal), u(unsigned decimal),t(binary 阅读全文
摘要:
1. ld的-static开关加上之后,就可以编译出一个静态链接的程序了。要注意该程序用到的所有的库,都要有相应的.a版本,编译的时候作为一个source file放到命令行中即可。光有库的.so没用,需要重新编译该库,让它生成.a文件。2. 要注意ld的一个特性:当ld查找一个symbol的时候,ld只会往后查找,不会往前查找。比如程序以来两个库A和B,而A库又调用了B库中的函数,那 么编译的时候,在命令行上,A库文件要出现在B库文件的前面。当ld发现A库中某个函数找不到时,他就会往后查找,于是在B库中找到了这个函数,OK。如 果AB两个库互相依赖,那么一般命令行中要写成A B A或B A 阅读全文
摘要:
很多 CPU ,如基于 Alpha, IA-64, MIPS, 和 SuperH 体系的,拒绝读取未对齐数据。当一个程序要求其中之一的 CPU 读取未对齐数据时,这时 CPU 会进入异常处理状态并且通知程序不能继续执行。举个例子,在 ARM, MIPS, 和 SH 硬件平台上,当操作系统被要求存取一个未对齐数据时默认通知应用程序一个异常。对齐性 对齐性是一种内存地址的特性,表现为内存地址模上 2 的幂。例如,内存地址 0x0001103F 模 4 结果为 3 ;这个地址就叫做与 4n + 3 对齐, 4 指出了所选用的 2 的幂的值。内存地址的对齐性取决于所选择的关于 2 的幂值。同样的地址模 阅读全文