sizeof

Threadx 字节内存池内存释放_tx_byte_release

旧城冷巷雨未停 提交于 2020-02-11 12:30:12
_tx_byte_release _tx_byte_release用于内存释放,原理参考上篇博文: Threadx 内存管理-内存字节池 UINT _tx_byte_release ( VOID * memory_ptr ) { TX_INTERRUPT_SAVE_AREA REG_1 TX_BYTE_POOL * pool_ptr ; /* Pool pointer */ REG_2 TX_THREAD * thread_ptr ; /* Working thread pointer */ REG_3 CHAR_PTR work_ptr ; /* Working block pointer */ REG_4 TX_THREAD * susp_thread_ptr ; /* Suspended thread pointer */ UINT preempt = 0 ; /* Preemption counter */ /* Determine if the memory pointer is valid. */ #def 记录要释放内存起始地址 work_ptr = ( CHAR_PTR ) memory_ptr ; if ( work_ptr ) { /* Back off the memory pointer to pickup its header. */ #def

ios学习之旅---指针也不难

落爺英雄遲暮 提交于 2020-02-11 10:24:41
1、认识指针 #include <stdio.h> //基本数据类型作为函数參数传递是值传递 //void moveFront(int x ,int y) //{ // x = x + 2; //} void test() { // 确定当前坐标 int x = 20; int y = 150; printf("%p\n",&x); printf("%lu\n",&x); *((int *)(0x7fff5fbff76c)) = 22; printf("(%d,%d)\n",x,y); // moveFront(x, y); // printf("(%d,%d)\n",x,y); } //假设你想訪问指针所指向存储空间,就必须使用訪问指针所指向的存储空间的操作符 void moveFront(int *x ,int *y) { // x = x + 2;//此时是改变指针的指向,而不是訪问指针所指向的存储空间 *x = *x + 2; } int main(int argc, const char * argv[]) { // 确定当前坐标 int x = 20; int y = 150; printf("(%d,%d)\n",x,y); moveFront(&x, &y); printf("(%d,%d)\n",x,y); return 0; } 2、指针的定义与初始化(重点掌握

C内存对齐

一世执手 提交于 2020-02-10 18:55:38
1.C语言中的结构体 1.1 定义 结构体 是由一系列相同或不同类型的变量组成的集合。 struct 结构体名{ //struct为关键字,“结构体名”为用户定义的 类型标识 。 数据类型1 成员名1; //{ }中是组成该结构体的成员,其中数据类型可以是C语言所允许的任何数据类型。 数据类型2 成员名2; ... 数据类型n 成员名n; }; 1.2 结构体的内存分配(方法一) 结构体在内存中分配一块连续的内存,但结构体内的变量并不一定是连续存放的,这涉及到内存对齐。 原则1 数据成员对齐规则:结构(struct或联合union)的数据成员,第一个数据成员放在offset为0的地方,以后每个数据成员存储的起始位置要从该成员大小的整数倍开始(比如int在32位机为4字节,则要从4的整数倍地址开始存储)。 原则2 结构体作为成员:如果一个结构里有某些结构体成员,则结构体成员要从其内部最大元素大小的整数倍地址开始存储。(struct a里存有struct b,b里有char,int,double等元素,那b应该从8的整数倍开始存储。) 原则3 收尾工作:结构体的总大小,也就是sizeof的结果,必须是其内部最大成员的整数倍,不足的要补齐。 例1. struct A{ struct B{ int a; char b; char b; int a; short c; short c; };

结构体struct 与 联合union

馋奶兔 提交于 2020-02-10 18:55:03
1.C语言中的结构体 1.1 定义 结构体 是由一系列相同或不同类型的变量组成的集合。 struct 结构体名{ //struct为关键字,“结构体名”为用户定义的 类型标识 。 数据类型1 成员名1; //{ }中是组成该结构体的成员,其中数据类型可以是C语言所允许的任何数据类型。 数据类型2 成员名2; ... 数据类型n 成员名n; }; 1.2 结构体的内存分配(方法一) 结构体在内存中分配一块连续的内存,但结构体内的变量并不一定是连续存放的,这涉及到内存对齐。 原则1 数据成员对齐规则:结构(struct或联合union)的数据成员,第一个数据成员放在offset为0的地方,以后每个数据成员存储的起始位置要从该成员大小的整数倍开始(比如int在32位机为4字节,则要从4的整数倍地址开始存储)。 原则2 结构体作为成员:如果一个结构里有某些结构体成员,则结构体成员要从其内部最大元素大小的整数倍地址开始存储。(struct a里存有struct b,b里有char,int,double等元素,那b应该从8的整数倍开始存储。) 原则3 收尾工作:结构体的总大小,也就是sizeof的结果,必须是其内部最大成员的整数倍,不足的要补齐。 例1. struct A{ struct B{ int a; char b; char b; int a; short c; short c; };

【存储类、链接、存储管理】分配内存:malloc()、free()

馋奶兔 提交于 2020-02-10 18:32:23
一、使用库函数:malloc()分配管理内存 (一)标识符 (Identifier) 1. 定义变量时,使用了诸如 a、abc、mn123 这样的名字,它们都是程序员自己起的,一般能够表达出变量的作用,这叫做标识符 2. 除了变量名,函数名、宏名、结构体名等都是标识符 3. C语言规定,标识符只能由字母(A~Z, a~z)、数字(0~9)和下划线(_)组成,并且第一个字符必须是字母或下划线,不能是数字。 4. 在标识符中,大小写是有区别的,例如 BOOK 和 book 是两个不同的标识符。 /*声明的同时,给出内存的标识符:x、place、a*/ /*系统将留出存储float/字符串足够的内存空间*/ /*所有程序必需留出足够内存来存储其使用的数据,一些内存分配是自动完成的:*/ float x; char place[]="dancing oxen creek"; /*也可明确要求确切的内存*/ int a[100]; (二)malloc()函数 1. 可以在程序运行时分配内存 2. malloc();函数实现 分配内存 的步骤: /*定义指针变量ptd*/ double * ptd; ptd = (double *)malloc(30 * sizeof(double)); ① malloc();函数 接收参数(所需内存字节数)【30 * sizeof(double)】 ②

为何不精通C? 04 辨析数组与指针

点点圈 提交于 2020-02-10 04:42:59
前言 学习C语言,指针绝对是一道大坎,很多人谈指针色变,使用起来小心翼翼的。“一切指针都是纸老虎” ,同时,对我们得“在战略上藐视指针,战术上重视指针”。 本文先 剖析 下 一维数组和指针 ,多维的情况后序博客继续更新。 文章流程: 1、辨析指针和数组的不同 2、辨析它们相同的时刻 3、总结 指针和数组为什么这么纠缠不清 首先说一点,指针的使用等同于数组的情况远远多于他们不同的情况,因此,在初学时,为了容易理解,很多人都 说 “指针=数组” 。 但是,这却 是错误 的! 来个例子吧: // file1.c 定义一个数组array int array[100];以上是在文件1中的定义 // file2.c 声明file1.c中的array extern int* array以上是在文件2中的声明 上面的例子对不对呢? 大家可以自己测试下,会很神奇的发现: 咔,怎么编译出 错 啦! 为什么 呢? 继续深入声明和定义 在辨析数组和指针前,首先要说下声明和定义的区别,之前博文“为何不精通C? 03 深入剖析声明” 中的末尾已经提过这一点了。这里重新说下: C语言中,对象 有且仅有一个定义 ,而声明却可以有 多个extern 声明 。 定义:只能出现在一个地方,确定同时分配内存,它是特殊的声明 声明:只是 描述 其他地方创建对象的 属性 。有extern前缀,作用于变量 对于 声明

C语言学习笔记--指针和数组的关系

懵懂的女人 提交于 2020-02-10 04:14:09
1. 数组的本质 ( 1 )数组是一段 连续的 内存空间 ( 2 )数组的空间大小: sizeof(array_type)*array_size; ( 3 )数组名可看做 指向数组第一个元素 的常量指针 (4 )数组声明时编译器自动分配 一片连续的内存空间 ,而 指针声明时只分配了用于容纳地址值的 4 字节 空间 2. 指针的运算 ( 1 )指针是一种特殊的变量,与整数的运算规则为: p + n == (unsigned int)p + n * sizeof(*p); 当指针 p 指向一个同类型的数组的元素时, p+1 指向当前元素的下一个元素, p-1 指向 上一个元素。 ( 2 )指针之间 只支持减法 运算且参与减法运算的指针 类型必须相同 。 p1 - p2 = ((unsigned int)p1 – (unsigned int)p2)/sizeof(type) ① 只有当两个指针指向同一个数组中的元素时,指针相减才有意义,其意义为指针所指元 素的下标差。 ② 当两个指针指向的元素不在同一个数组中时,结果未定义。 指针运算的应用 #include <stdio.h> //统计元素的个数 #define DIM(a) (sizeof(a) / sizeof(*a)) int main() { char s[]={'H','e','l','l','o'};//栈 char*

linux下netlink的使用简介

廉价感情. 提交于 2020-02-09 14:41:58
linux下netlink的使用简介 一、什么是netlink Netlink套接字是用以实现用户进程与内核进程通信的一种特殊的进程间通信(IPC) ,也是网络应用程序与内核通信的最常用的接口。 在Linux 内核中,使用netlink 进行应用与内核通信的应用有很多,如 路由 daemon(NETLINK_ROUTE) 用户态 socket 协议(NETLINK_USERSOCK) 防火墙(NETLINK_FIREWALL) netfilter 子系统(NETLINK_NETFILTER) 内核事件向用户态通知(NETLINK_KOBJECT_UEVENT) 通用netlink(NETLINK_GENERIC) Netlink 是一种在内核与用户应用间进行双向数据传输的非常好的方式,用户态应用使用标准的 socket API 就可以使用 netlink 提供的强大功能,内核态需要使用专门的内核 API 来使用 netlink。 一般来说用户空间和内核空间的通信方式有三种: /proc、ioctl、Netlink 。而前两种都是单向的,而Netlink可以实现双工通信。 Netlink 相对于系统调用,ioctl 以及 /proc文件系统而言,具有以下优点: netlink使用简单,只需要在 include/linux/netlink.h 中增加一个新类型的 netlink

nginx 地址对齐(ngx_align_ptr)

本小妞迷上赌 提交于 2020-02-08 23:05:38
内存池,要在大块连续内存上,分配小块内存,指向小内存块的地址是否对齐,对系统性能有一定影响:因为 cpu 从主存上读取数据很慢的,合理的地址对齐可以减少访问次数,提高访问效率。看看 nginx 的[内存池地址对齐操作: // p 是内存指针,a 是对齐字节数 # define ngx_align_ptr(p, a) \ (u_char *) (((uintptr_t) (p) + ((uintptr_t) a - 1)) & ~((uintptr_t) a - 1)) 该宏的原理详细证明,请参考 《高效算法的奥秘》(第二版)第三章 2 的幂边界 当 $ a = 2^n$ 时, ~((uintptr_t) a - 1)) 的 64 位二进制数,最右边 n n n 位数是 0。所以 x & ~((uintptr_t) a - 1)) 能被 2 n 2^n 2 n 整除。 a 对齐字节数 2 的幂 64位二进制 1 2 0 2^0 2 0 1111111111111111111111111111111111111111111111111111111111111111 2 2 1 2^1 2 1 1111111111111111111111111111111111111111111111111111111111111110 4 2 2 2^2 2 2

ACM线性基学习笔记

故事扮演 提交于 2020-02-08 05:51:15
https://www.cnblogs.com/31415926535x/p/11260897.html 概述 最近的几场多校出现了好几次线性基的题目,,会想起之前在尝试西安区域赛的一道区间异或和最大的问题时,当时因为异或的性质知道这道题肯定用线段树来维护区间的最值,但是不知道用什么来处理异或和最大,,即使后来知道了可以用线性基来处理,看了一些博客也因为感觉太难收藏到书签就再也没看过,,,于是这几天,花了差不多4、5天的时间,大概看懂了这部分的内容,感觉这只是一种专门处理异或问题的一个工具,光这个工具没什么意思,,现在的很多题目都是用线性基套各种东西,,比如说很常见的线段树(大多都是询问)、树链剖分(也就是树上路径的异或问题,主要是求LCA来维护)、简单图以及像杭电第一场的那题一样贪心魔改线性基板子等等,,不可能单纯的只是用线性基板子来求一个什么最值,K值,并交等等性质,下面是我这几天学习线性基的简单的一个学习过程的记录。 数学知识 关于线性基,虽然看起来这三个字很高深,,但是等大致了解之后,就会发现,这只是一个简单的数学工具,基础知识就是学过的线性代数 (虽然早就忘记了) 。 抛开线性代数,我个人的理解就是 线性基就是一个用来表示给定集合的一个最少的数的集合, 用线性基这个集合,可以表示它所 张成 的一个集合,对于我们遇到的大多数题目来说,就是用一个最少的数的集合 \(lb\)