
c
卖火柴的小男孩2020
你在驴背上看世界,世界在驴胯下看你
展开
-
详解4字节对齐
所谓的字节对齐,就是各种类型的数据按照一定的规则在空间上排列,而不是顺序的一个接一个的排放,这个就是对齐。我们经常听说的对齐在N上,它的含义就是数据的存放起始地址%N==0。具体对齐规则会在下面的篇幅中介绍。首先还是让我们来看一下,为什么要进行字节对齐吧。各个硬件平台对存储空间的处理上有很大的不同。一些平台对某些特定类型的数据只能从某些特定地址开始存取。比如有些架构的CPU,诸如SPARC在访问一个没有进行对齐的变量的时候会发生错误,那么在这种架构上必须编程必须保证字节对齐。而有些平台对于没有进行对齐.原创 2020-08-18 15:14:28 · 3564 阅读 · 0 评论 -
c语言进位计算
代码如下:int color = 4;LOGE("color:%x\n", color);color |= (color << 8);//color |= (color << 16);LOGE("color:%x\n", color);color |= (color << 16);LOGE("color:%x\n", color);log...原创 2020-04-15 11:44:36 · 1663 阅读 · 0 评论 -
C语言calloc的效率为何那么高?操作系统究竟是如何分配内存的?
在C语言程序开发中,提到动态内存分配时,基本上每个程序员都明白 calloc() 和 malloc() 库函数的区别——calloc() 函数不仅分配内存,还会将分配后的内存清零,而 malloc() 函数则对分配好的内存不做任何操作。calloc() 函数的效率比 malloc()+memsecalloc() 函数的效率比 malloc()+memset() 函数更高?很多C语言程序...原创 2020-04-09 16:03:33 · 1288 阅读 · 0 评论 -
C语言条件编译(#if,#ifdef,#ifndef,#endif,#else,#elif)
条件编译(conditional compiling)命令指定预处理器依据特定的条件来判断保留或删除某段源代码。例如,可以使用条件编译让源代码适用于不同的目标系统,而不需要管理该源代码的各种不同版本。条件编译区域以 #if、#ifdef 或 #ifndef 等命令作为开头,以 #endif 命令结尾。条件编译区域可以有任意数量的 #elif 命令,但最多一个 #else 命令。以 #if 开头的...原创 2020-04-09 15:49:18 · 568 阅读 · 0 评论 -
RISC-V踩坑记----__builtin_clz((x)库函数的应用
RISC-V的确是个好东西,可是,免费的东西往往需要付出代价才能得到了,最近遇到了一个算法中的问题,追了好久,最终追到了这个库函数中,没想到,这个库函数居然还隐藏着一些猫腻。值得记下来啊。首先上一个在X86平台下的例子: 1#include <stdio.h> 2 /* Position of the most significant bit of x */...原创 2020-04-09 12:09:12 · 2342 阅读 · 1 评论 -
c语言中“#if 0 / #if 1 ... #endif”的作用(注释的作用)
1.“#if 0/#if 1 ... #endif”的作用我们知道,C标准不提供C++里的“//”这样的单行风格注释而只提供“/* */”这样的块注释功能,我们通常使用它写代码中说明性的注释文字(注释作用)以及在调试时关闭某段代码对编译器的可见性(屏蔽作用),当然,这里所谓的“注释作用”和“屏蔽作用”是我们从功能上下的主观定义,对预处理器而言,两者并无任何区别。对于前者,因为“注释...原创 2020-04-08 17:48:27 · 1956 阅读 · 0 评论 -
for语言在.c文件中的用法,即std小于c99时的用法
#include "logs.h"void SDL_TouchQuit(void){ int jj; for (jj = 0; jj < 3; jj++) { LOGE("i:%d\n",jj); } int i; for (i = SDL_num_touch; i--; ) { LOGE("i:%...原创 2020-04-07 14:39:08 · 199 阅读 · 0 评论 -
C语言 共用体(Union)详解及示例代码
通过前面的讲解,我们知道结构体(Struct)是一种构造类型或复杂类型,它可以包含多个类型不同的成员。在C语言中,还有另外一种和结构体非常类似的语法,叫做共用体(Union),它的定义格式为:union 共用体名{ 成员列表};共用体有时也被称为联合或者联合体,这也是 Union 这个单词的本意。结构体和共用体的区别在于:结构体的各个成员会占用不同的内存,互相之间没有影响;而共用体...原创 2020-04-04 20:35:50 · 2309 阅读 · 0 评论 -
C/C++数组的下标可以为负
今天偶然碰到C/C++的数组下标可以为负值,感到十分奇怪。平时写代码,下标都是从零开始,从来没考虑到这个问题。写了一下测试代码,居然通过了。但是值却是乱的。但是如果你写下标的值在数组的范围内,是可以输出一个正确的值的。int a[5] = {1,2,3,4,5};int *ptr1 = (int*)(&a+1); printf("%x,%x,",ptr1[-1]);12...转载 2020-01-16 17:46:40 · 1087 阅读 · 1 评论 -
c/c++字节序与大小端转换
一.多字节值及字节序1.brief现在有一个数字 65430,这个数字在二进制的内存中一个字节无法完全存下,存储这个数字需要1个字节以上的空间。这样的值被称为多字节量(multi-byte quantity)。65430在内存中由两个字节表示:0xFF 和 0x96 ,其中:0xFF被称为最高有效字节(most significant byte, MSB)0x96...原创 2020-01-08 10:34:40 · 1310 阅读 · 0 评论 -
C/C++ 大小端、位域、内存详解
前言面试时遇到关于大小端、位段(或者叫位域)和内存对齐的考题,然后就不知所措了。这部分对于嵌入式底层工作者是必须要掌握的,其他方面不是必须的;但还是很有必要学习理解这些知识点,因为它可以让你更了解C++的,了解程序在内存的运行情况,也能加深对计算机系统的理解。1、大小端在现代的“冯.诺依曼体系结构”计算机中,计算机内的数制都是采用二进制来存储,并且是以8位,一个字节为单位...原创 2020-01-08 10:28:04 · 799 阅读 · 0 评论 -
C/C++字节对齐
字节对齐原因:1)平台原因(移植原因):不是所有的硬件平台都能访问任意地址上的任意数据,某些硬件平台只能在某些地址处取某些特定类型的数据,否则抛出硬件异常2)硬件原因:经过内存对齐之后,CPU的内存访问速度大大提升,帮助cpu寻址。【注意】(对齐位数跟处理器位数和编译器都有关)VS, VC等编译器默认是#pragma pack(8),所以测试我们的规则会正常;注意gcc默认是#pragm...原创 2020-01-08 10:24:36 · 252 阅读 · 0 评论 -
C/C++中各种数据类型、结构体、类 占用字节数分析与总结
一、基本数据类型在不同编译器下占用字节数比较与总结,测试过程不详述了,直接看下表结论!下表中右侧总结部分是依据占用字节数进行着色,同一种颜色类型的数据成员占用字节数要么一致,要么具有同样的性质,这样比较容易理解的记忆。占用字节数16位编译器 32位编译器 64位编译器总结char 1 1 1char一直占1个字符,任何编译器都只占一个字节char* 2...原创 2020-01-08 10:24:00 · 1552 阅读 · 0 评论 -
C和C++中的基本数据类型的大小及表示范围详解
本文研究的主要问题时关于C和C++中的基本数据类型int、long、long long、float、double、char、string的大小及表示范围,具体介绍如下。一、基本类型的大小及范围的总结(以下所讲都是默认在32位操作系统下):字节:byte;位:bit。1.短整型short:所占内存大小:2byte=16bit;所能表示范围:-32768~32767;(即-2^15~2...原创 2020-01-08 10:10:10 · 1839 阅读 · 0 评论 -
C/C++中字节序、类型转化的深入理解
如果将字节序、类型转化单独一个拿出来说时,大家可能都觉得很简单,但是理解的不深入。如果将其结合起来探讨,可能我们就会理解的很透彻。关于字节序和类型转化的基础,大家如果不太理解,可以参考以下博客:https://my.oschina.net/u/1783725/blog/647973 大小字节序https://my.oschina.net/u/1783725/blog/700970...原创 2020-01-08 10:08:45 · 571 阅读 · 0 评论 -
闲聊c/c++: 谈内存(大/小端,高/低字节,高/低地址)
c/c++和其他语言最大区别在于: 指针指针就是内存地址,一旦明白了指针与内存地址相关的内容,那理解其他语言,就易如反掌。而且你可以把其他语言用的更加好,更加有效率例如java/js/objc中为什么容器中只能存储引用类型?如果存储基本数据类型(值类型),为什么会发生效率很低的装箱拆箱行为?而c#为什么就不会呢?你怎么才能让不使用的内存尽快被垃圾收集器回收过去?还有很多涉及内存...原创 2020-01-08 10:02:23 · 1525 阅读 · 0 评论 -
C语言位运算符
位运算是指按二进制进行的运算。在系统软件中,常常需要处理二进制位的问题。C语言提供了6个位操作运算符。这些运算符只能用于整型操作数,即只能用于带符号或无符号的char,short,int与long类型。C语言提供的位运算符列表:1、“按位与”运算符(&)按位与是指:参加运算的两个数据,按二进制位进行“与”运算。如果两个相应的二进制位都为1,则该位的结果值为1;否则...原创 2020-01-07 17:06:04 · 1019 阅读 · 0 评论 -
c语言基础资料
C语言: 链表 -- (环形双链表)环形双链表示意图: Dome: #pragma once #include<stdio.h> #include<stdlib.h> /*节点数据结构*/ typedef struct node { int data;//值 struct node* pPer;//上一节点 struct node* pNext;//下一节点 }N...转载 2020-01-07 16:09:39 · 226 阅读 · 0 评论 -
九大排序算法
链接到参考链接九大排序算法,你会几个?visualgo排序算法时间复杂度、空间复杂度、稳定性比较排序分类(9)1. 插入排序直接插入排序难度:简单 必须掌握思路:将一个记录插入到已排序好的有序表中,从而得到一个新,记录数增1的有序表图示:算法复杂度:O(n^2) ;稳定算法代码:void InsertSort(int a[],int n){ ...转载 2019-12-30 16:24:27 · 139 阅读 · 0 评论 -
linux 显式链接so库
linux加载程序变成进程的过程fork进程, 在内核创建进程相关内核项, 加载进程可执行文件查找依赖的so库, 加载映射虚拟地址初始化程序变量动态库依赖越多, 进程启动就越慢, 并且发布程序的时候, 这些链接但没有使用的so同样要一起跟着发布, 否则进程启动时候找不到对应的so导致启动失败.一些查看依赖的命令查看依赖关系: readelf -d xx.so查看链接到的so库: ...转载 2019-12-30 15:57:30 · 244 阅读 · 0 评论 -
c/c++ 线程池
概念 原理 线程池简单来说就是有一堆已经创建好的线程(最大数目一定),初始时他们都处于空闲状态,当有新的任务进来,从线程池中取出一个空闲的线程处理任务,然后当任务处理完成之后,该线程被重新放回到线程池中,供其他的任务使用,当线程池中的线程都在处理任务时,就没有空闲线程供使用,此时,若有新的任务产生,只能等待线程池中有线程结束任务空闲才能执行 为什么使用线程池 因为线程的创建...转载 2019-12-30 11:04:40 · 266 阅读 · 0 评论 -
回调函数
函数指针:指向函数入口地址void Invoke(char* s);int main(){ void (*fp)(char* s); //声明一个函数指针(fp) fp=Invoke; //将Invoke函数的入口地址赋值给fp fp("Hello World!\n"); //函数指针fp实现函数调用 re...转载 2019-12-30 10:14:48 · 104 阅读 · 0 评论 -
内存对齐
概念:是一个数据类型所能存放的内存地址的属性又称字节对齐。如一个数据类型的内存对齐为8时,这个数据类型所定义出来的所有变量其内存地址都是8的倍数。自然对齐:对齐属性和数据类型的大小相等,如4字节大小的int型数据默认它的字节对齐也是4。目的:内存对齐可以提高CPU读取内存的效率。(32位的x86 CPU,一个时钟周期可以读取4个连续的内存单元,即4字节),如一个int放在奇数内存位置上,想...转载 2019-12-30 10:10:37 · 97 阅读 · 0 评论 -
学习C语言有什么书适合新手看
学习C语言不是一朝一夕的事情,但也不需要花费十年时间才能精通。如何以最小的代价学习并精通C语言是本文的主题。请注意,即使是“最小的代价”,也绝不是什么捷径,而是以最短的时间取得最多的收获,同时也意味着你需要经历艰苦的过程。一、要读就读好书,否则不如不读 所有初学者面临的第一个问题便是:如何选择教材。好的开始是成功的一半,选择一本优秀的教材是事半功倍的关键因素。不幸的是,学校通常会帮你指定一本...原创 2019-04-12 13:35:44 · 7903 阅读 · 0 评论