sizeof

C语言结构体及其内存布局

匿名 (未验证) 提交于 2019-12-02 23:41:02
结构体的定义 结构体的定义要使用struct关键字,并以";"结尾。 下面找个微软定义的结构体: typedef struct _FILETIME { DWORD dwLowDateTime; DWORD dwHighDateTime; } FILETIME, *PFILETIME, *LPFILETIME; 可以看出在定义结构体时使用了typedef,为_FILETIME起了一个别名,并定义了指向改结构 的指针PFILETIME。 结构体变量的初始化与赋值操作 使用初始化列表进行初始化 例如: FILETIME ft = { 88,99 }; 还可以使用memset进行清零初始化: FILETIME ft memset(&ft,0,sizeof(ft)); 结构体变量赋值 C++11标准之前只能在结构体变量初始化的时候可以使用列表进行初始化, 现在支持C++11标准的编译器可以在任意场合使用列表进行赋值,编译时不会报错. 例: C++11标准还可以直接在定义结构体时为每个成员指定初值,例: 但是最后还是不要使用新标准这两个特性,因为在不支持C++11标准的编译器上会报错, 一个空结构体的大小 一个空结构体的大小为1字节,而不是零字节 例: 计算结构体大小 结构体成员对齐值 typedef struct tagTest { char m_chTest; int m_nTest;

模拟qsort实现冒泡排序

匿名 (未验证) 提交于 2019-12-02 23:36:01
1.数组指针 数组指针是指针,指针指向数组,其内部保存的是数组的地址,只要是指针,就占4个字节。 比如: int arr[5]; //数组 int *parr1[10]; //指针数组 int (*parr2)[10];//数组指针 int (*parr3[10])[5]; //数组指针数组 解释:命名规则按照操作符的优先级来决定。 2.函数指针和定义 定义:函数指针是指向函数的指针变量。 用途:调用函数和做函数的参数 声明方法:返回值类型(*指针变量名)([形参列表]) 比如: #include <stdio.h> void test() { printf("hehe\n"); } int main() { printf("%p\n", test); printf("%p\n", &test); return 0; } 运行结果: 输出的是两个地址,这两个地址是 test 函数的地址。 那我们的函数的地址要想保存起来,怎么保存? 下面我们看代 码: void test() { printf("hehe\n"); } //下面pfun1和pfun2哪个有能力存放test函数的地址? void (*pfun1)(); void *pfun2(); 首先,能给存储地址,就要求pfun1或者pfun2是指针,那么答案就是:pfun1可以存放。pfun1先和*结合,说明pfun1是指针

网络报文的数据格式定义和使用

匿名 (未验证) 提交于 2019-12-02 23:34:01
服务器端: #include<WinSock2.h> #include<Windows.h> #include<stdio.h> #include<iostream> #pragma comment(lib,"ws2_32.lib") enum CMD { CMD_Login,CMD_Logout,CMD_ERROR }; //包头 struct DataHeader { short dataLength; short cmd; }; //包体 struct Login { char username[32]; char password[32]; }; struct LoginResult { int result; }; struct Logout { char username[32]; }; struct LogoutResult { int result; }; int main() { WORD ver = MAKEWORD(2, 2); WSADATA dat; //WinSocket启动 WSAStartup(ver, &dat); //1、建立一个socket SOCKET _sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); //AF_INET创建一个IPV4的套接字,SOCK_STREAM面向数据流的

字符串指针数组长度

匿名 (未验证) 提交于 2019-12-02 23:32:01
const char *cmdMsgString[] = { "OK", "ERROR", "RING", "RING&CID", "CFGTDM" }; #if 1//test printf("----------------------------------------------\n"); printf("string : %s\n",(string));  //CFGTDM printf("strlen(string) : %d\n",strlen(string));  //6 printf("sizeof(string) : %d\n",sizeof(string));  //4 printf("sizeof(*string) : %d\n",sizeof(*string));  //1 printf("*(char *)(string+1) : %c\n",*(char *)(string+1));  //F printf("\n"); printf("(cmdMsgString[4]) : %s\n",(cmdMsgString[4]));  //CFGTDM printf("strlen(cmdMsgString[4]) : %d\n",strlen(cmdMsgString[4]));  //6 printf("sizeof(cmdMsgString) : %d

最短路的几种算法和模板

喜你入骨 提交于 2019-12-02 23:00:44
最短路分为单源最短路和多源汇最短路; 1单源最短路根据边长的正负分为两类(n表示点,m表示边) (1)边长为正 dijkstra算法 朴素版(o(n^2)) 堆优化版(0(mlogn)) 当稠密图(m>=n^2)时朴素版的时间更优,稀疏图则用堆优化版更优; (2)边权有负 bellman_ford算法 0(nm) 由于SPFA算法是bellman_ford的优化,bellman_ford常用于求有边数限制的最短路,如在不经过超过k条边时的最短路,注意这时的不存在最短路的临界条件是dist[n]>0x3f3f3f3f,因为可能存在,dist[t]=0x3f3f3f3f,但存在t到n的边可能松弛dist[n]; SPFA O(m),最坏O(nm) 还可用来求负环,也可以用来求正权最短路 2.多源汇最短路 folyd算法 0(n^3) 适合稠密图 dijkstra算法朴素版 #include<iostream> #include<cstring> using namespace std; int g[510][510]; int n,m; int vis[510],dist[510]; int dijkstra() { memset(dist,0x3f,sizeof dist); dist[1]=0; for(int i=0;i<n;i++) { int t=-1; for(int j

高通SDM845平台Sensor学习――4.SLPI(SAM Sensor)

匿名 (未验证) 提交于 2019-12-02 22:56:40
上文中,我们大致了解了物理sensor driver整个流程,但在项目中,一般写这种sensor driver的情况很少。这种sensor driver基本上都是各个vendor厂商提供的,我们也只需要看懂即可。 但是SAM sensor我们完全是可以自己写的,根据一些物理sensor的数据,来实现一些算法。 比如,实现拿起唤醒功能,这个功能在oem手机中非常常见。 基本功能就是:当用户拿起手机时,手机屏幕亮起,此时可以通过脸部识别,来解锁手机等等。 这时好多人可能会说,这不是很简单吗?在framework层就可以做,注册一个加速度传感器,并根据data做一定算法处理。根本不需要再SLPI侧再实现一个SAM sensor。这种思维就是典型的应用层程序员的思想,系统层程序员如果有这种思想,那就很危险了。 为什么不能再framework层上做算法处理呢? framework层进行算法处理,当系统睡下去怎么办?若是注册Non-Wakeup的sensor的话,在系统suspend时,不会有任何数据上报,如何唤醒系统呢?若是注册Wakeup的sensor的话,系统会被wakelock住,根本睡不下去,这时系统功耗非常高。 可见在framework层做的想法是在系统层面不可能实施的。 那么在SLPI侧实现pick up sensor的思路是什么呢? pick up

C# 快速释放内存的大数组

匿名 (未验证) 提交于 2019-12-02 22:10:10
本文告诉大家如何使用 Marshal 做出可以快速释放内存的大数组。 最近在做 3D ,需要不断申请一段大内存数组,然后就释放他,但是 C# 对于大内存不是立刻释放,所以就存在一定的性能问题。 在博客园看到了一位大神使用 Marshal 做出快速申请的大数组,于是我就学他的方法来弄一个。本文告诉大家这个类是如何使用 在使用的时候,先来看下原来的 C# 的大数组性能。可以看到在不停gc,性能不好 static void Main(string[] args) { for (int i = 0; i < 10000; i++) { Foo(); } Console.ReadKey(); } private static void Foo() { var foo = new byte[1000000000]; } 在使用 Marshal 之前需要知道这是什么,其实 Marshal 就是一个提供 COM 互操作的方法。 下面使用一个快速申请 int 数组来告诉大家如何使用。 是否还记得 C 的申请数组?其实下面的方法和 C 的相同 int n = 100000;//长度 IntPtr buffer = Marshal.AllocHGlobal(sizeof(int) * n); 这时就可以使用 buffer 作为数组 下面对他的第 k 个元素修改 IntPtr buffer =

系统调用IO和标准IO

匿名 (未验证) 提交于 2019-12-02 21:56:30
Ŀ¼ open close read write lseek ioctl 在Linux中一切皆文件,文件操作在Linux中是十分重要的。为此, Linux内核提供了一组用户进程与内核进行交互的接口用于对文件和设备进行访问控制,这些接口被称为系统调用。 系统调用对于应用程序最大的作用在于: 以统一的形式,为应用程序提供了一组文件访问的抽象接口,应用程序不需要关心文件的具体类型,也不用关心其内部实现细节。 常用的系统调用IO函数有5个:open、close、read、write、ioctl,此外还有个非系统调用IO函数lseek,系统调用IO都是不带缓冲的IO。 open open用于创建一个新文件或打开一个已有文件,返回一个非负的文件描述符fd。 0、1、2为系统预定义的文件描述符,分别代表STDIN_FILENO、STDOUT_FILENO、STDERR_FILENO。 #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> //成功返回文件描述符,失败返回-1 int open ( const char * pathname , int flags , ... /* mode_t mode */ ); flags参数一般在O_RDONLY、O_WRONLY和O_RDWR中选择指定一个

go中整型的用法小结

允我心安 提交于 2019-12-02 20:28:27
代码示例 // 整型的用法小结 // 注意: // 整型变量在使用时,遵循保小不保大的原则 // 尽量使用占用空间小的数据类型 package main import ( "fmt" "unsafe" ) func main() { // int var a int // 64位系统 fmt.Printf("a 的默认值是 %d, 类型是 %T, 取值范围是 -9223372036854775808 ~ 9223372036854775807\n", a, a) // a 的默认值是 0, 类型是 int, 取值范围是 -9223372036854775808 ~ 9223372036854775807 // 默认是 int 类型 var b = 1 fmt.Printf("b 是 %T 类型, 值是 %d, 占 %d 个字节\n", b, b, unsafe.Sizeof(b)) // b 是 int 类型, 值是 1, 占 8 个字节 // int8 var c int8 fmt.Printf("c 的默认值是 %d, 类型是 %T, 取值范围是 -128 ~ 127\n", c, c) // c 的默认值是 0, 类型是 int8, 取值范围是 -128 ~ 127 var d int8 = 127 fmt.Printf("d 是 %T 类型, 值是 %d, 占 %d 个字节