sizeof

C结构体之位域(位段)

谁说我不能喝 提交于 2020-01-09 05:02:06
几篇较全面的位域相关的文章: http://www.uplook.cn/blog/9/93362/ C/C++位域(Bit-fields)之我见 C中的位域与大小端问题 内存对齐全攻略–涉及位域的内存对齐原则 本文主要对位域相关知识进行了一下梳理,参考如下: C语言中的位域 史上最全的C位域总结 2 C结构体之位域(位段) C/C++中以一定区域内的位(bit)为单位来表示的数据成为位域,位域必须指明具体的数目。 位域的作用主要是节省内存资源,使数据结构更紧凑。 1. 一个位域必须存储在同一个字节中,不能跨两个字节,故位域的长度不能大于一个字节的长度。 如一个字节所剩空间不够存放另一位域时,应从下一单元起存放该位域。也可以有意使某位域从下一单元开始。例如: struct BitField { unsigned int a:4; //占用4个二进制位; unsigned int :0; //空位域,自动置0; unsigned int b:4; //占用4个二进制位,从下一个存储单元开始存放; unsigned int c:4; //占用4个二进制位; unsigned int d:5; //占用5个二进制位,剩余的4个bit不够存储4个bit的数据,从下一个存储单元开始存放; unsigned int :0; //空位域,自动置0; unsigned int e:4; /

[C++]C++面试知识总结

只谈情不闲聊 提交于 2020-01-08 23:40:04
1.程序运行知识 1.1 内存布局和分配方式 C程序的内存布局如下: 静态存储区:存储全局变量和static变量,通常在程序编译期间已经分配好了。 BSS段:存放未初始化的static变量和全局变量 Data段:存放初始化过的static变量和全局变量 Text段:存储程序的二进制代码,程序代码区。   堆:程序运行时通过malloc申请的内存区存放在堆中,需要使用free来释放该内存空间,生存期在malloc和free之间。 栈:执行函数时,函数的局部变量存储在栈中,执行结束后自动释放该内存区域,栈内存分配运算内置与处理器指令集中。 C++程序的内存布局与C程序布局类似,区别是C++不再区分全局变量和静态变量是否已经初始化,全部存储在静态存储区;另外堆中存放new/delete申请释放的资源,而malloc和free申请的资源存放在自由存储区。 1.2 内存溢出原因 栈溢出:越界访问造成,例如局部变量数组越界访问或者函数内局部变量使用过多,超出了操作系统为该进程分配的栈的大小,还有递归函数层次过多超过了栈大小。 堆溢出:程序申请了资源但忘记释放该资源,造成内存泄露,累积泄露内存过多会造成内存溢出。 1.3 内存泄露和检测 C++内存泄漏检测内存泄露是指程序中动态分配了内存,但是在程序结束时没有释放这部分内存,从而造成那一部分内存不可用的情况。 动态内存泄露检测:检查new

opencl(二十一)----直方图

房东的猫 提交于 2020-01-07 03:19:27
计算RGB图像的直方图 // kernel __kernel void histogram(__global uchar* imgdata, __global uint *histogram, __local uint *local_histogram, uint data_size_item, uint all_byte_size) { // 对局部数据进行初始化 for(uchar i =0;i<32;i++) { local_histogram[0]=0; } barrier(CLK_LOCAL_MEM_FENCE);// 局部同步 int item_offset = get_global_id(0) * data_size_item *3; // 遍历该工作项所处理的数据 for(int i = item_offset;i<item_offset+data_size_item *3&&i<all_byte_size;i+=3) { // B atomic_inc(local_histogram+imgdata[i]/8+64); // G atomic_inc(local_histogram+imgdata[i+1]/8+32); // R atomic_inc(local_histogram+imgdata[i+2]/8); } barrier(CLK_GLOBAL

hihoCoder 1387 A Research on \"The Hundred Family Surnames\"

旧街凉风 提交于 2020-01-07 00:59:11
搬家一个月,庆祝一下 啪啪啪啪啪啪啪啪啪啪❀❀❀❀ 题目 传送门 分析: 这什么奇奇怪怪的OJ,以前从来不知道的2333 以前只知道合并两个连通块时,其中一边直径端点为A,B,另一边为C,D D=max( dis(A,B) , dis(A,C) , dis(A,D) , dis(B,C) , dis(B,D) , dis(C,D) ) 原来合并两颗就在原树上可能交叉的虚树,竟然也可以用这个 而且多条直径也不会影响答案?? 细想一下貌似很有道理的亚子。。。 记录记录2333 调了半天 这个歪歪扣不仅丧病而且脑子不太好使,虚树上两点之间连边距离不是1 太菜了dbq #include<cstdio> #include<cstring> #include<cmath> #include<algorithm> #include<vector> #include<iostream> #include<map> #include<string> #define maxn 500005 #define INF 0x3f3f3f3f using namespace std; inline long long getint() { long long num=0,flag=1;char c; while((c=getchar())<'0'||c>'9')if(c=='-')flag=-1; while

第一章-实例3-计算变量所占字节数

自古美人都是妖i 提交于 2020-01-06 23:04:00
本程序实现的功能比较重要,程序中主要使用的是函数sizeof(),用这个函数可以对各种类型的变量进行所占内存字节数的测量。当然,sizeof()的使用方法很多,这里只举出部分使用方法。 功能:判断数据类型长度符的关键字 用法:sizeof(类型说明符,数组名或表达式),或sizeof变量名 定义:其作用就是返回一个对象或者类型所占的内存字节数 来源: https://www.cnblogs.com/FangXu1998/p/12150395.html

多角度深入理解printf函数

回眸只為那壹抹淺笑 提交于 2020-01-06 22:58:05
一、函数简介 printf()函数属于C语言标准库函数,用于将格式化后的字符串输出到标准输出stdout。标准输出,即标准输出文件。printf()是和平台相关的函数。在PC上,printf()是输出到终端屏幕,终端屏幕即为对应的标准输出;在嵌入式设备上,printf()一般输出到串口,串口即为对应的标准输出。 1、常见的函数原型 int printf(const char *format, ...) 2、使用时需要包含头文件 #include <stdio.h> 3、调用格式 printf("<格式化字符串>", <参量表>); 参量表 :包含0个或多个参量,每个参量可以是变量、常量、表达式、函数等。 格式化字符串 :包含每个参量项对应的转换说明。 转换说明 :把以二进制格式存储在计算机中的值转换成一系列字符(字符串)以便于显示。例如: printf("Today is May %d.\n", 25); 其中%d的意思是把给定的值翻译成十进制整数文本并打印出来。 4、返回值 如果函数执行成功,则返回写入的字符个数;如果有输出错误,则返回一个负值(printf()的旧版本会返回不同的值)。 二、库函数编译链接过程 C编程的基本策略是,用程序把源代码文件转换为可执行文件(其中包含可直接运行的机器语言代码)。典型的C实现通过编译和链接两个步骤来完成这一过程。编译器把源代码转换成中间代码

多媒体文件格式(五):PCM / WAV 格式

こ雲淡風輕ζ 提交于 2020-01-06 21:30:00
一、名词解析 PCM(Pulse Code Modulation)也被称为脉码编码调制,PCM中的声音数据没有被压缩,它是由模拟信号经过采样、量化、编码转换成的标准的数字音频数据。采样转换方式参考下图进行了解: 音频采样包含以下几大要素: 1. 采样率 采样率表示音频信号每秒的数字快照数。该速率决定了音频文件的频率范围。采样率越高,数字波形的形状越接近原始模拟波形。低采样率会限制可录制的频率范围,这可导致录音表现原始声音的效果不佳。根据奈奎斯特采样定理,为了重现给定频率,采样率必须至少是该频率的两倍。例如,一般CD唱片的采样率为每秒 44,100 个采样,因此可重现最高为 22,050 Hz 的频率,此频率刚好超过人类的听力极限 20,000 Hz。 图中A是低采样率的音频信号,其效果已经将原始声波进行了扭曲,B则是完全重现原始声波的高采样率的音频信号。 数字音频常用的采样率如下: 2. 位深度 位深度决定动态范围。采样声波时,为每个采样指定最接近原始声波振幅的振幅值。较高的位深度可提供更多可能的振幅值,产生更大的动态范围、更低的噪声基准和更高的保真度。 位深度越高,提供的动态范围越大。 二、PCM 在上面的名词解析中我们应该对PCM有了一定的理解和认识,下面我们将对PCM做更多的讲解。 1. PCM音频数据存储方式 如果是单声道的文件,采样数据按时间的先后顺序依次存入

sizeof()和strlen()的区别

主宰稳场 提交于 2020-01-05 13:50:43
1、#include<iostream> 运算符 sizeof 功能:计算可见字符串包括 '\0’的s的长度 sizeof是C/C++中的一个操作符(operator),简单的说其作用就是返回一个对象或者类型所占的内存字节数 2、strlen是一个函数 #include <string.h> int strlen(char *s) 功能:计算可见字符串s的长度 说明:返回s的长度,不包括结束符NULL int strlen(const char *str) {   int len = 0; assert(str != NULL); while(*str++) { len++; } return len; } 由函数原型可以知道: strlen所作的仅仅是一个计数器的工作,它从内存的某个位置(可以是字符串开头,中间某个位置,甚至是某个不确定的内存区域)开始扫描,直到碰到第一个字符串结束符'\0'为止,然后返回计数器值。 来源: https://www.cnblogs.com/briskzou/p/12152197.html

Why is forward declaration of structure not working in my code? When can it be used in C?

旧城冷巷雨未停 提交于 2020-01-05 10:28:33
问题 Isn't forward declaration, whether for structures or functions, supposed to do what forward declaration is expected to do, ie, to let us use the structure or function before they are defined? Why is the forward declaration of a structure not working in my code? And the main thing that just misses me, is forward declaration of structures of any use in C at all? When is it used? Can you please give me a small C program example to illustrate this? My program gives the error error: storage size

TEA加密/解密算法

有些话、适合烂在心里 提交于 2020-01-04 21:31:01
在游戏项目中,一般需要对资源或数据进行加密保护,最简单高效的加密算法就是采用位与或之类的,但是比较容易被人分析出来。 TEA加密算法不但比较简单,而且有很强的抗差分分析能力,加密速度也比较快。可以根据项目需求设置加密轮数来增加加密强度。 1.加密核心函数 1 void EncryptTEA(unsigned int *firstChunk, unsigned int *secondChunk, unsigned int* key) 2 { 3 unsigned int y = *firstChunk; 4 unsigned int z = *secondChunk; 5 unsigned int sum = 0; 6 7 unsigned int delta = 0x9e3779b9; 8 9 for (int i = 0; i < 8; i++)//8轮运算(需要对应下面的解密核心函数的轮数一样) 10 { 11 sum += delta; 12 y += ((z << 4) + key[0]) ^ (z + sum) ^ ((z >> 5) + key[1]); 13 z += ((y << 4) + key[2]) ^ (y + sum) ^ ((y >> 5) + key[3]); 14 } 15 16 *firstChunk = y; 17 *secondChunk =