分类:编程

C/CPP, Unix Like

解除clock_gettime@@GLIBC_2.17的依赖

在x86_64的Debian Jessie上交叉编译一个mipsel架构的程序,能静态链接的都静态链接了。 程序编译好传送到mipsel架构的设备上时,ldd查看库的依赖,却提示

(⊙﹏⊙)b mipsel设备上运行着Debian Wheezy,使用的是glibc 2.13:

尝试了更新到glibc 2.17,结果运行所有动态链接glibc的程序都提示Segmentation fault或Bus error,眼看要变砖!!!∑(゚Д゚ノ)ノ,最后用一个静态链接版本 […]

Read more No Comments
C/CPP, 编程

探讨C语言返回struct的实现

C语言基本类型的返回通过寄存器实现。 寄存器容量不大,一个结构体的大小不定,多塞几个成员,很容易就会超过寄存器的容量,不太可能通过寄存器一次性返回一个结构体。 把以下代码转为汇编,探个究竟:

优化后的代码可能比较晦涩,64位寄存器数量是32位的一倍,为了简便理解,关闭代码优化,并且转为32位汇编,命令:

结果:

汇编代码已写上注释。 在get_struct()函数中,调用fun()之前,会首先把ge […]

Read more 2 Comments
C/CPP, 编程

关于Visual Studio C LANG下pow()函数的重载

当初看到Visual Studio 2010的这个提示,我真当VS实现了C LANG的函数重载。 今天即兴尝试VS下C LANG的函数重载,虽然IDE没报语法错误,但编译器编译时会报错。无奈之下只好打开长长的math.h一探究竟。 通过全文搜索很容易找到math.h声明的pow()原型:

声明的这些原型一眼看上去没什么问题,挺正常的重载方式。不过math.h内容有点多,不细心点还是看不出来,实际上pow()的重载使用了条件编译:

查找了一下资料,得知” […]

Read more No Comments
PHP, 编程

PHP线程安全与非线程安全版本的本质区别

在百度上搜“PHP 线程安全 非线程安全”,你肯定会找到这种狗屁话: 一本正经说胡话,完完全全没解释到点上。 稍微懂点C语言的都不会相信这种话,更别谈说出来了,千转载万转载你转载我我转载你就转载点那么没水平的东西来忽悠人。   线程和进程最大的根本区别就是内存数据的共享。 每个进程都独享一个虚拟内存[虚拟内存 = 物理内存 + SWAP/页面文件)]。 一个进程可以拥有多个线程,一般来说一个线程仅独享一个进程的虚拟内存中的一个函数栈帧。   程序储存数据有下面几种常用的方式: 自动变量: 自动变量是储存在栈中的,随着函数的调用而产生,结束而销毁。 静态(全局)变量: 静态分 […]

Read more No Comments
C/CPP

为何C语言函数可以返回struct

struct可由多个数据类型构成,初步看起来应该类似数组,变量本身是一个指向首字节的指针,无法直接通过此指针赋值struct,在函数中声明为自动变量时,也无法返回此指针所指向的值。 但事实上就并非如此,struct之间可以直接赋值,使用指针指向其地址时需要使用”&”,函数中声明为自动变量时可以直接return其值。 那struct变量本身到底是何? 写了这样一个东西,运行后瞬间明白:

struct变量就和基本类型,int, char等一样,直接指向其值,而且struct有多少字节,那个值就有多少字 […]

Read more 1 Comment