C/C++部分
文章平均质量分 63
zenny_chen
GitHub: https://github.com/zenny-chen/
Gitee: https://gitee.com/zenny-chen/
【CPU Dasher X】https://itunes.apple.com/cn/app/cpu-dasherx/id1168527539?l=en&mt=8
《OpenCL异构并行》:https://item.jd.com/11818715.html
《C语言编程魔法书》:https://item.jd.com/12737899067.html
展开
-
Ubuntu下使用GLUT与GDK将图片文件加载到纹理单元
在Linux系统中有不少开源好用的工具库用来读取图片文件,识别其格式,然后以RGB等原生像素格式存储到存储器中。比如libpng就是其中之一。不过我们这里使用更方便好用、更通用的GTK+库中所包含的GDK工具库对指定的图片文件进行读取,然后读取其内部原生像素数据,最后映射到纹理单元上。原创 2023-04-27 18:22:46 · 184 阅读 · 0 评论 -
Ubuntu下GTK与GLUT的共同使用
今天不知神马原因,一下子突发奇想,试想了一下GTK与GLUT是否可以相互协作,经过初步测试,这还算是可行的。在以下demo中,我们可以点击由GTK创建的按钮然后弹出用GLUT创建的窗口。由于GTK与GLUT是两个完全独立的库,两者均含有各自的消息循环(也就是通常所说的runloop),因此当我们点击按钮弹出GLUT窗口的时候,其实相应的都是GLUT的消息循环,GTK此时处于冻结状态。只有当我们将GLUT窗口关闭之后,GTK窗口才会被再次激活,侦听消息。原创 2023-04-27 18:20:12 · 117 阅读 · 0 评论 -
Ubuntu下使用GLUT编写OpenGL程序
在Linux下以及Windows操作系统下编写OpenGL程序已经变得非常便捷了,我们只需安装freeglut工具包即可。老旧的GLUT已经废弃了,现在如果我们要在一些类Unix系统上编写OpenGL程序的话需要安装FreeGLUT。原创 2023-04-27 18:17:12 · 979 阅读 · 0 评论 -
Ubuntu下如何安装GTK+3
如果我们要在Ubuntu系统下使用基于GTK+3开发的App,那么我们无需安装任何东西,直接双击该App即可使用。如果我们要安装GTK+3.0进行开发,可使用以下命令原创 2023-04-27 15:43:20 · 4626 阅读 · 0 评论 -
C11中的通用字符名(Universal Character Names)
C11标准中引入了通用字符名(Universal Character Names)这个概念。其实,所为的通用字符名也就是我们俗称的Unicode。C11中采用两种方法来表示通用字符名,第一种是 \u 后面加正好四位十六进制数,不能多也不能少。第二种则是 \U 后面加正好八位十六进制数,不能多也不能少。原创 2023-04-23 16:23:57 · 165 阅读 · 0 评论 -
C语言中函数定义使用不带参数与使用void参数的区别
我们在C语言中定义函数时,往往将不带参数的函数声明为 foo() 这种形式。尽管这种方式很直观,而且也跟其他类C语言声明的方式一样,然而这对于C语言而言不是真正能确定的不允许带任何参数的函数形式。原创 2023-04-23 16:19:41 · 1324 阅读 · 0 评论 -
再谈C语言中的预处理系统
C语言中的预处理器系统是一种十分古老而又神奇的存在。其实大部分汇编语言也具备预处理系统。预处理系统其实就是对当前宿主语言的 元语言(Meta-Language),可用来根据当前的环境以及配置来“生成”相应的源代码。原创 2023-04-23 16:16:11 · 652 阅读 · 0 评论 -
再谈C语言中的语句
在《C语言编程魔法书》中的14章第6节已经详细讨论了C语言的六种语句:标签语句(labeled statement)、复合语句(compound statement)、表达式语句(expression statement)、选择语句(selection statement)、迭代语句(iteration statement)以及跳转语句(jump statement)。这里,我将对其中的表达式语句中的一种特殊形式的语句再做讨论——即 空语句(null statement)原创 2023-04-23 16:09:00 · 320 阅读 · 0 评论 -
用C++11的std::unique_ptr取代C++98中老旧的std::auto_ptr
各位倘若是用MSVC来尝试编译上述代码的话,则不能使用C++17或更新C++标准,而只能使用C++11或C++14进行编译。不过好在这两个类一些常用的基本接口、包括接口名都没有换,而且语义也保持一致。因此我们通常情况下直接可实现无缝替换。下面我们用比较简短的代码样例来描述这两者的等价替换性。由于MSVC编译器在C++17中顺应标准,将老旧的。因此我们只能用C++11起新引入的。和 std::auto_ptr。一般常用的方法有:get。原创 2023-04-23 15:57:35 · 204 阅读 · 0 评论 -
C/C++ ABI以及如何对动态连接库加载一个C++成员函数符号
介绍C与C++编程语言的ABI,并描述如何对动态连接库加载一个C++中一个类的成员函数符号原创 2023-03-26 22:35:21 · 1216 阅读 · 0 评论 -
C语言对目标文件、静态库与动态库的连接及外部符号的可见性
用C语言对目标文件、静态库与动态库的连接及外部符号的可见性的详细描述原创 2023-03-25 03:57:28 · 1989 阅读 · 2 评论 -
C++20中std::ranges的常用函数的替代实现
C++20中引入了 库,可方便灵活地对容器中的元素进行查找等操作。不过对于有些环境,比如当前的Android平台,尽管Clang编译器能支持较完整的C++20特性,但无奈其C++标准库中缺少了 的实现,因此我们对于某些使用该库的代码需要做一些替代实现。...原创 2022-07-10 04:44:25 · 1042 阅读 · 0 评论 -
Intel x87 FPU的使用基础
Intel x87 FPU专门用于执行标量浮点计算,可以对单精度浮点(32位)、双精度浮点(64位)以及扩展双精度浮点(80位)进行计算,并顺从IEEE754标准。x87 FPU可以工作在32位兼容模式下以及64位模式下,在这两种下,FPU的数据寄存器的个数都一样,只有8个。对x87 FPU的数据寄存器的访问方式与一般的寄存器有所不同,它是栈式访问。你通过 FLD 指令把外部数据搬到x87 FPU的数据寄存器中时,那么x87 FPU会根据所搬数据的长度(32位、64位、80位)将输入数据分别对待为单精度浮原创 2021-10-30 00:39:50 · 3346 阅读 · 0 评论 -
计算一个数组所有元素之和(无锁方法)
上一贴介绍了比较常见的基于旋锁的并行计算方法。这里将介绍另一种无锁的并行计算方法。两者各有利弊。同样是计算一个数组,在Blackfin561双核DSP中,可以利用两个核对一个数组进行同时计算,其中一个核计算该数组的前50个元素,另一个核计算该数组的后50个元素。下面贴除源代码: // 在共享存储区// shared.cint resultA = 0, resultB = 0;原创 2008-02-14 20:41:00 · 2017 阅读 · 0 评论 -
出一道比较八卦的问题(考验各位objective-C/C++的基础,呵呵)
出一道比较八卦的问题(考验各位objective-C/C++的基础,呵呵)原创 2010-05-11 22:15:00 · 1101 阅读 · 0 评论 -
对多核共享变量的读写操作
在PC处理器中,往往没有像嵌入式系统那样含有一块多核共享的高速缓存(一般是SRAM)。也就是说我们在PC处理器的多核共享变量都是统一被映射到内存(DDR)中去的。那么这就会导致一系列的问题。原创 2010-08-07 10:19:00 · 4986 阅读 · 9 评论 -
我的C++小工具库——递增
以下库完成的是直接获得运行时常量的从i开始加,i + (i + 1) + (i + 2) + ... + n的工具:main函数用于测试:原创 2010-10-05 18:16:00 · 1610 阅读 · 8 评论 -
C++0x中编写可递归的Lambda
尽管使用递归的Lambda会因为增加外部额外的副作用而使得执行效率降低些,但很多时候还是蛮有用的,呵呵。一般而言,Lambda是无法递归的。这个在大部分支持Lambda特性的编程语言中均是如此。原创 2010-11-30 15:26:00 · 4990 阅读 · 4 评论 -
C++基本语法之——声明与定义
C++基本语法之——声明与定义原创 2010-10-24 12:22:00 · 1082 阅读 · 0 评论 -
C++基本语法之——“一次定义”规则
C++基本语法之——“一个定义”规则原创 2010-10-25 23:34:00 · 2006 阅读 · 0 评论 -
LLVM/GCC中如何使用Intel格式的汇编
在GCC以及LLVM编译器中,默认情况下,如果使用汇编或在C/C++,Objective C/C++中内嵌汇编的话都是AT&T格式。原创 2011-01-24 23:19:00 · 5228 阅读 · 1 评论 -
C/C++中取地址符&的语义
在C语言中,&符号大家一定很熟悉吧。它除了可以作为按位运算“与”之外还有更常用的功能——取变量地址。我们首先看下面一个简单的例子:#include intmain(void){inta=0;int*p=&a;printf("Thevalueis:%d/n",*p);return0;}上面代码中,指针p指向变量a的地址。在C/C++中,每个原创 2008-06-04 19:41:00 · 45667 阅读 · 11 评论 -
AT&T汇编针对x86指令集格式
目前很多开源基于x86处理器环境的C/C++,Objective-C/C++编译器所带的汇编器使用AT&T格式。AT&T汇编针对x86指令集与其它处理器(比如ARM、Blackfin等)有所不同,它与Intel自定义的汇编格式有比较大的偏差。GCC的汇编器能支持Intel语法特性,可以参考我前面的博文来获悉如何使用。不过对于最新的LLVM2.0,又开始弃用Intel语法特性了。因此不管怎么说了解A原创 2011-04-14 00:03:00 · 9805 阅读 · 4 评论 -
使用C11的原子操作来实现线性单链表操作
随着多核处理器的逐步普及,各种对于多核多线程并行计算的算法也得到了深入研究。而在高性能并行计算方面,许多处理器引入了原子操作以便同步多核多线程可共享的资源。在多核多线程环境中,要对某一个共享资源进行同步必须用到原子操作,即便是像mutex、semaphore等传统的锁机制也是需要通过原子操作来实现。为了加速对共享资源的访问操作,许多无锁的算法(lock-free或non-blocking)被设计出来,通过消除锁来避免锁带来的系统开销。原创 2016-11-14 16:44:48 · 3496 阅读 · 4 评论 -
在iPhone项目中放入汇编文件,并用C与汇编代码混合
在iPhone项目中放入汇编文件,并用C与汇编代码混合原创 2010-05-11 22:08:00 · 1227 阅读 · 0 评论 -
帮你了解Selector
帮你了解Selector原创 2010-04-07 12:38:00 · 1758 阅读 · 4 评论 -
多处理器/多核处理器的并行处理方法之——微线程
上面有两篇文章介绍了两类比较典型且简单的并行方法,并且也简单地介绍了它们的性能以及优缺点。这里将再一种介绍方法:通过微线程来同步多个相互协作的并行任务。我们来想像一下下面这个问题:在一个已知长度的巨大线性表(如一维数组)当中要搜索一个元素,并且其中的元素都是唯一的。我们现在所用的处理器有两个核,根据前面介绍的第二种并行方法,我们可以简单地让核A去搜索前一半元素,让核B去搜索后一半元素。原创 2008-07-14 18:56:00 · 4540 阅读 · 1 评论 -
C++中基本数据类型的较特别形式的初始化
#include iostream>using namespace std;template typename T>class Test...{private: T type; int *p;public: Test(void) : type(T()), p() // p(int*()) is not valid ...{ }};int main(v原创 2008-04-12 21:38:00 · 969 阅读 · 0 评论 -
关于较复杂表达式声明的解析
前一阵子看到论坛中C语言版本有这么个题目:char (*(*x())[])() char (*(*x[3])())[5]解析上面两个变量(或函数)的类型。以下是我的回复: #include stdio.h>// 关于x的解析:char test1(void)...{ return O;}char test2(void)...{ return K;原创 2008-01-03 19:47:00 · 971 阅读 · 0 评论 -
char**为何无法转为const char**?——对const的进一步探讨
在CSDN上的论坛中,我已经发表过两篇关于const的用法以及修饰方式。这里想更深入地探究const的本质问题。我们都这么用过:char a = 0;const char *p = &a; 也就是说char*可以转为const char*。这个是合法的,因为const char*意味着该指针变量指向char类型变量的地址,任何通过p来指向变量a地址的指针变量只能用const*来原创 2008-03-23 12:47:00 · 2698 阅读 · 1 评论 -
Intel C++ Compiler(Ver10.1.020)试用后感想
Intel推出的C/C++编译器,功能很齐全,附带有很棒的调试器。我是将它嵌入在Visual Studio 2005.NET中进行使用的。由于是Intel的编译器,因此它自然含有非常丰富的编译优化选项,支持各种高级指令集以及SIMD等特性。同时,它也支持OPENMP。当然,这个微软的VC++编译器也支持。不过最让我感到兴奋的还是Intel编译器几乎完整地支持C99标准,这个是VC9.0也没有支原创 2008-03-04 21:41:00 · 4548 阅读 · 2 评论 -
计算一个数组所有元素之和(基于多处理器的并行开发讨论)
我早些时候上传了 《双核协作完成搜索β》(详细可见我的资源),这个方法是无锁并行计算方法,下面介绍一种更长见的带锁的多处理器计算方法。这个方法若使用像OpenMP这样的编译工具的话会使得代码更好看,更自然一些。 以下代码是我基于Blackfin561双核DSP,VisualDSP++4.5环境下通过测试的。这个方法比无锁更容易实现,不过如果没有OpenMP的话,在对一些临界变量进行上锁时原创 2008-02-13 23:47:00 · 1427 阅读 · 0 评论 -
C与C++函数的不同特性
C与C++函数最大的不同点在于——C++函数可以重载,即几个函数的函数名可以相同,但是参数类型或参数个数必须不同;而C函数在一个环境中不能同名。这其中可以引申出关于为什么C++的类型安全机制比C更好的原因。先请看下面的代码: // a.c#include stdio.h>void Hi(void)...{ puts("Hi");}void test(void)..原创 2007-10-09 23:03:00 · 1320 阅读 · 2 评论 -
C/C++中的字符串另类连接
#include stdio.h>int main(void)...{ const char* s = "Hello"", world!"; printf("Hello""Me""you! "); // output: HelloMeyou return 0;}原创 2007-10-25 21:53:00 · 864 阅读 · 0 评论 -
操作符重载集锦
在C++中约定,对于++操作符重载 ,将不带参数的作为前项++,将带有一个int类型亚参数的重载作为后项++。 #include iostream>using namespace std;class Data...{private: int d;public: Data(void) : d(0) ...{ } Data(int i) : d(i)原创 2007-10-25 21:37:00 · 711 阅读 · 0 评论 -
注意C++中对象指针,慎用void*
由于不同C++编译器对C++对象模型的结构可能是不一样的。比如说,VC++系列是将虚函数表指针放在对象首地址,而GCC系列的编译器则是将虚函数表指针放在对象地址尾部。 那么下面我将详细讲讲GCC编译器下的对象模型(含虚函数表指针)。 先看下面这个例子: #include iostream>using namespace std;cla原创 2007-10-07 19:57:00 · 3695 阅读 · 0 评论 -
子类继承父类的构造函数(方法)吗?
最近我看见有人问过这个问题。在此我想表达一下自己的观点。 根据面向对象中关于继承这个概念——子类继承父类所有的属性和方法。那么既然是所有的那么本人认为也应当也包括构造函数(方法)。 我先举一个C++的例子: class Parent...{private: int p;public: Parent(void) : p(0原创 2007-09-23 22:17:00 · 10849 阅读 · 3 评论 -
浅谈C/C++的类型迭代问题
众所周知,C/C++以及Java、C#等语言都属于强类型语言,在声明一个变量时总要带有有一个具体的类型。不过在基本类型的变化上,C/C++要丰富很多(具体情况下面会进行逐一介绍),而Java和C#中除了基本类型外,能进行迭代组合的就是数组种别了,这几个语言都能够基于数组的维数进行理论上的无穷迭代——比如:int a[][][][][]...[](Java和C#可以将[]放在变量标识符a的前面)。原创 2008-07-25 00:44:00 · 1430 阅读 · 1 评论 -
C++多彩的运算符语义以及对引用的语义解析
熟悉C/C++编程语言的朋友都知道,在C/C++中对于有些运算符和关键字在不同场合会有不同的语义,有时甚至是截然不同。比如,在作为双目运算符时,*表示乘法运算;&表示按位相与运算。而作为单目运算符时,*表示取指针所指地址的内容;&表示取变量地址或脱去解引用(参考http://blog.csdn.net/zenny_chen/archive/2008/06/04/2512056.aspx)。然而,原创 2008-08-05 22:14:00 · 1102 阅读 · 1 评论 -
在objective-C类中声明一个数组型成员变量的property
在objective-C类中声明一个数组型成员变量的property原创 2010-04-07 12:36:00 · 1030 阅读 · 0 评论