size_t

size_t 类型

☆樱花仙子☆ 提交于 2020-01-26 02:52:27
1 关于size_t定义   size_t是一种数据相关的无符号类型,它被设计得足够大以便能够内存中任意对象的大小。在cstddef头文件中定义了size_t类型,这个文件是C标准库stddef.h头文件的C++版本。   在需要通过数组下标来访问数组时,通常建议将下标定义size_t类型,因为一般来说在进行下标访问时,下标都是正的。当然,也不是所有的下标访问操作下标都是正的,比如以下代码: int a[10]={1,2,3,4,5,6,7,8,9,10}; int * ptr =&(a[4]); cout<<ptr[-2]<<endl;   这段代码中对ptr进行了下标访问,并且下标是负的,但是这个访问并不是错误的,执行的结果是输出3。 2 在Visual Studio2012中查看size_t 的定义 在VS中,选中size_t,右键调出菜单,选择“转到定义”,会自动跳转到size_t的定义位置。在我的机子上,跳到了的文件目录:d:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\include\crtdefs.h。(这里为什么跳到了crtdef.h这个头文件而不是上面说的cstddef头文件?) 来看看在windows下是如何定义这个size_t的: #ifndef _SIZE_T_DEFINED #ifdef

redis源码分析(3)sds

丶灬走出姿态 提交于 2020-01-25 04:52:19
sds是redis中用来处理字符串的数据结构。sds的定义在sds.h中: 1 typedef char *sds; 简洁明了!简明扼要!(X,玩我呢是吧!这特么不就是c中的字符串么?!)。像redis这种高端大气上档次的服务器显然不会这么的幼稚。在sds的定义之后,还有一个结构体: 1 struct sdshdr { 2 int len; 3 int free; 4 char buf[]; 5 } 有len,有free,这就有点意思了。很明显,根据这个结构体的定义,这是sds的header,用来存储sds的信息。注意最后的buf定义,这个buf数组没有设置长度。这是为神马呢?在gcc中,这种方式可以使得buf成为一个可变的数组,也就是说,可以扩展buf同时又保证在使用的时候,感觉buf始终在struct sdshdr中。有点啰嗦,其实可以用下图展示: sdshdr sds | | V V ---------------------------- |len | free | buf … | ---------------------------- 这个就是sds的内存分布图。struct sdshdr这个结构体放在了真正的数据之前,且是紧挨着的。这样,通过buf引用的数组其实就是后面的数据。这个是利用了c中数组访问的特点。 下面我们来看看如何创建一个sds: 1 /* Create

Redis3.20阅读-SDS实现

好久不见. 提交于 2020-01-25 04:51:12
声明:这是本人参考黄建宏的《redis设计与实现》(源码版本是redis3.0)来学习redis3.20源码的笔记,如果有什么不对的地方,欢迎大家指正,大家一起学习、一起进步,QQ:499656254。 一、SDS介绍 SDS又叫简单动态字符串,在Redis中默认使用SDS来表示字符串。比如在Redis中的键值对中的键一般都是使用SDS来实现。首先需要说明的是在Redis中,字符串不是用传统的字符串来实现,而是Redis自己构建了一个结构来表示字符串。优点如下: 1、O(1)时间内获取字符串长度。(依据其结构特性,只需要访问其结构体成员len既可获得字符串长度) 2、SDS提供的一些API操作,是二进制安全的(也就是不会因为空格等特殊字符而中断字符串)、不会溢出(API操作会检查其长度) 3、减少了修改字符串时带来的内存重分配次数。 对于增长字符串其采用的策略是检查修改之后的长度大小,如果小于1024*1024,则分配2倍的修改后的长度+1 对于减少的字符串其并不立即释放空间,而是回归到alloc中去。 这个构建的结构在Redis3.20中的表示如下(和Redis2.x中还是有一定区别的): typedef char *sds; /* Note: sdshdr5 is never used, we just access the flags byte directly. *

size_t详细解释

廉价感情. 提交于 2020-01-24 20:49:25
在学习sizeof运算符的时候,它的值类型为size_t,结果在使用printf函数显示的时候,凭空多了很多警告,有点不不理解,为啥搞这么复杂?直接用个int类型多省事? 经过一番搜索和阅读文档,找到了答案,总结如下: 问题1:为啥不用int而是size_t这么古怪的类型,搞出好多类型不匹配的警告? 答:一个共识是:int类型一般小于等于数据线的宽度,而size_t类型一般为大于等于地址线宽度。而地址线宽度常常是大于数据线宽度的。 在数据只有8位的年代,地址率先进入10位,12位,在数据16位的年代,地址也已经进入了20位,24位。目前的int普遍是32位,而地址线宽度在主流平台中都是64位。 size_t为什么存在?因为无论int还是unsigned都很可能小于地址线宽度需要的大小,所以必须有个size_t。 问题2:为什么size_t后面要什么有个_t? 答:_t的意思就是type。关于为什么要加_t。一个类型后面加了_t说明了这是一个POSIX或GNU保留类型,防止命名空间污染(namespace pollution)。 不然标准库里新加了什么类型说不定就和用户已经定义的类型重名了。所以POSIX规定自己扩展的类型都加_t,这样只要用户定义类型的时候不加_t就不会冲突。 来源: https://www.cnblogs.com/litifeng/p/7464307.html

利用libcurl下载图片

非 Y 不嫁゛ 提交于 2020-01-23 02:38:37
//Crawl.cpp #include "Crawl.h" using namespace std; CCrawl::CCrawl() { } CCrawl::~CCrawl() { } size_t CCrawl::WriteMemoryCallback(void *contents, size_t size, size_t nmemb, void *userp) { size_t realsize = size * nmemb; struct MemoryStruct *mem = (struct MemoryStruct *)userp; char *ptr = (char *)realloc(mem->memory, mem->size + realsize + 1); if(ptr == NULL) { /* out of memory! */ printf("not enough memory (realloc returned NULL)\n"); // exit(1); return 0; } mem->memory = ptr; memcpy(&(mem->memory[mem->size]), contents, realsize); mem->size += realsize; mem->memory[mem->size] = 0; return

C++得到当前进程所占用的内存

血红的双手。 提交于 2020-01-22 12:05:21
//使用SDK的PSAPI (Process Status Helper) //中的 //BOOL GetProcessMemoryInfo( // HANDLE Process, // PPROCESS_MEMORY_COUNTERS ppsmemCounters, // DWORD cb //); // //typedef struct _PROCESS_MEMORY_COUNTERS { // DWORD cb; // DWORD PageFaultCount; // SIZE_T PeakWorkingSetSize; //峰值内存使用 // SIZE_T WorkingSetSize; //内存使用 // SIZE_T QuotaPeakPagedPoolUsage; // SIZE_T QuotaPagedPoolUsage; // SIZE_T QuotaPeakNonPagedPoolUsage; // SIZE_T QuotaNonPagedPoolUsage; // SIZE_T PagefileUsage; //虚拟内存使用 // SIZE_T PeakPagefileUsage; //峰值虚拟内存使用 //} PROCESS_MEMORY_COUNTERS, //*PPROCESS_MEMORY_COUNTERS; #include <iostream>

c语言文件基础知识

喜你入骨 提交于 2020-01-21 08:35:45
#include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <string.h> /* * EOF: 符号常量,其值为-1. * fgets() 最多读取int-1个字符,遇换行或EOF即返回. * fputs() 写文件时,忽略字符串截止符'\0'. * fread()和fwrite() 数据块读写,多用于结构体数组(顺序存储的结构体). * * 函数原型: * 读: * int fgetc(FILE *stream); * char *fgets(char *s, int size, FILE *stream); * size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream); * int fscanf(FILE *stream, const char *format, ...); * 写: * int fputc(int c, FILE *stream); * int fputs(const char *s, FILE *stream); * size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream); * int fprintf(FILE

unsigned int vs. size_t

爷,独闯天下 提交于 2020-01-20 13:35:37
我注意到现代 C 和C ++代码似乎在任何地方使用 size_t 而不是 int / unsigned int - 从C字符串函数的参数到STL。 我很好奇这个原因及其带来的好处。 #1楼 size_t 类型是无符号整数类型,它是 sizeof 运算符(和 offsetof 运算符)的结果,因此保证它足够大以包含系统可以处理的最大对象的大小(例如,静态数组8GB)。 size_t 类型可能大于,等于或小于 unsigned int ,并且您的编译器可能会对其进行假设以进行优化。 您可以在C99标准中找到更准确的信息,第7.17节,其草案可在因特网上以 pdf 格式或在C11标准第7.19节中获得,也可作为 pdf草案获得 。 #2楼 类型size_t必须足够大,以存储任何可能对象的大小。 Unsigned int不必满足该条件。 例如,在64位系统中int和unsigned int可能是32位宽,但size_t必须足够大以存储大于4G的数字 #3楼 经典C(由Brian Kernighan和Dennis Ritchie在C编程语言中描述的C的早期方言,Prentice-Hall,1978)没有提供 size_t 。 C标准委员会引入 size_t 来消除可移植性问题 在embedded.com上详细解释(有一个很好的例子) #4楼 size_t类型是sizeof运算符返回的类型。

关于size_t与size_type

余生长醉 提交于 2020-01-20 10:21:55
整理自 关于size_t与size_type 问题起源于这样一段代码: #include <algorithm> #include <stdio.h> int main() { size_t indexs = -1; size_t ps = 100; int index = -1; int p = 100; printf("%d\n",std::min(p,index)); printf("%d\n",std::min(ps,indexs)); return 0; } 其实是很简单的题目,不过要对size_t类型有一个了解才行。 关于size_t的来源: 数据类型"socklen_t"和int应该具有相同的长度。否则就会破坏BSD套接字层的填充.POSIX开始的时候用的是size_t, Linus Torvalds(他希望有更多的人,但显然不是很多) 努力向他们解释使用size_t是完全错误的,因为在64位结构中 size_t和int的长度是不一样的,而这个参数(也就是accept函数的第三参数)的长度必须和int一致,因为这是BSD套接字接口标准.最终POSIX的那帮家伙找到了解决的办法,那就是创造了一个新的类型"socklen_t".Linux Torvalds说这是由于他们发现了自己的错误但又不好意思向大家伙儿承认,所以另外创造了一个新的数据类型 。 size

size_t

六眼飞鱼酱① 提交于 2020-01-20 08:48:03
size_t在C语言中就有了。 它是一种“整型”类型,里面保存的是一个整数,就像int, long那样。这种整数用来记录一个大小(size)。size_t的全称应该是size type,就是说“一种用来记录大小的数据类型”。 通常我们用sizeof(XXX)操作,这个操作所得到的结果就是size_t类型。 因为size_t类型的数据其实是保存了一个整数,所以它也可以做加减乘除,也可以转化为int并赋值给int类型的变量。 类似的还有wchar_t, ptrdiff_t。 wchar_t就是wide char type,“一种用来记录一个宽字符的数据类型”。 ptrdiff_t就是pointer difference type,“一种用来记录两个指针之间的距离的数据类型”。 通常,size_t和ptrdiff_t都是用typedef来实现的。你可能在某个头文件里面找到类似的语句: typedef unsigned int size_t; 而wchar_t则稍有不同。在一些旧的编译器中,wchar_t也可能是用typedef来实现,但是新的标准中wchar_t已经是C/C++语言的关键字,wchar_t类型的地位已经和char, int的地位等同了。 在标准C/C++的语法中,只有int float char bool等基本的数据类型,至于size_t,或size