从string.size()和string.length()聊到长度的问题和一个关于数据结构定义的技巧
最近工作中要查看一下string的长度,然后忘了是哪个函数,所以去网上搜了一搜,决定把网上学的和其他的一些有关长度的东西在这里汇总一下, 然后就有了此帖.
string 是从c语言的char数组的概念发展出来的.但是char指针变量仍然和string的变量不是一个东西,虽然他们都可能是跟字符串打交道. 看下面的例子:
char a[4] = "ab";
char c[] = "ab";
string b = "ab"; -----> b[0] = 'a'; b[1] = 'b'; b[b.size()-1] = 'b'
在string中b.length()和 b.size()没什么区别,就是指去掉'\0'后的字符串的长度 b.length()=2 b.size()=2
现在我们再来看看sizeof(a) 和 strlen(a)的区别 sizeof(a) = 4 sizeof(c) = 3 strlen(a)=2 strlen(c) = 2.
sizeof求的是真正的内存分配的长度, strlen求的是字符串的长度(注意字符串长度不包括'\0')
int* a; 32位机器上面 sizeof(a) = 4 在64位机器上sizeof(a) = 8 [因为指针就是一个地址,这个地址必须能覆盖机器的所有选址空间 所有32位机器= 4 * 8 而64位机器= 8 * 8 所以指针大小会有变化]
指针长度好确定,但是int,short,long,char等长度的确定就比较麻烦了下面一段的学习来源 http://blog.sina.com.cn/s/blog_865e6dd50102vmqr.html
int值,short值,char值等的长度规则
1. c/c++规定int字长和机器字长相同
2. 操作系统字长和机器字长未必相同 (机器字长即cpu的字长,指的是其一条指令/一次运算 可以处理的最大宽度)
3.编译器根据操作系统字长来定义int字长
所以在无os的嵌入式计算机系统上 int的长度和处理器字长一致; 有操作系统的时候,编译器会根据操作系统的字长来定义int字长: 假如windows64上面运行Dos16,那么所以for dos16的c/c++编译器中int都是16位的,
简单的说是编译器觉得了int的长度是多少
对于整型的数值范围,每一个编译器里面都有一个标准头文件:limits.h,这个头文件中定义了一些该编译器所使用的所有数据类型的范围的宏.例如
#include<limits.h>
int的最大值 INT_MAX 最小值 INT_MIN unsigned int 的最大值 UINT_MAX
在数据结构的设计中,优秀的程序员并不会定义下面的数据结构(假设为win32平台)
typedef struct tagTypeExample
{
unsigned short x;
unsigned int y;
} TypeExample;
他们会像下面那样定义:
#define UINT16 unsigned short //16位无符号整数
#define UINT32 unsigned int //32位无符号整数
typedef struct tagTypeExample
{
UINT16 x;
UINT32 y;
}TypeExample;
因为这样定义的数据结构非常具有通用性,如果上述32平台上的数据要发送给16位平台,在16位平台上仅仅需要修改UINT16, UINT32的定义,就可以接收并存储32位平台的数据了.
#define unsigned int UINT16 //16位无符号整数 ---->对应32位平台的short
#define unsigned long UINT32 //32位无符号整数 ----->对应32位平台的int
几乎所有的优秀软件设计文档都是这么定义数据结构的.!!!!!
从string.size()和string.length()聊到长度的问题和一个关于数据结构定义的技巧的更多相关文章
- String构造器中originalValue.length>size 发生的情况
最近在看Jdk6中String的源码的时候发现String的有个这样的构造方法,源代码内容如下: public String(String original) { int size = origina ...
- Java for循环每次都通过list.size()和 string.length()获取大小是否消耗性能?
前言 有人说在for循环之前用一个局部变量先获取到list.size().str.length(),然后在for循环的判断条件里通过这个局部变量替换list.size().str.length()会节 ...
- The length of the string value exceeds the length configured in the mapping/parameter.
在NHibernate 3.3 中存储的字符串太长,会抛异常:The length of the string value exceeds the length configured in the m ...
- String详解, String和CharSequence区别, StringBuilder和StringBuffer的区别 (String系列之1)
本章主要介绍String和CharSequence的区别,以及它们的API详细使用方法. 转载请注明出处:http://www.cnblogs.com/skywang12345/p/string01. ...
- [转] 请别再拿“String s = new String("xyz");创建了多少个String实例”来面试了吧
这帖是用来回复高级语言虚拟机圈子里的一个问题,一道Java笔试题的. 本来因为见得太多已经吐槽无力,但这次实在忍不住了就又爆发了一把.写得太长干脆单独开了一帖. 顺带广告:对JVM感兴趣的同学们同志们 ...
- Java JVM 请别拿“String s=new String("z");创建了多少实例”来面试 [ 转载 ]
Java 请别再拿“String s = new String("xyz");创建了多少个String实例”来面试了吧 [ 转载 ] @author RednaxelaFX 原文链 ...
- C#"曾经的字符串数组"string[] array=new string[]{"**","****"};
写博客是一件很伟大的事情,尤其是也牛逼的博客,因为它能帮助需要的人,更能使自己对知识有一个更为深刻的理解! 欢迎关注我的博客! 字符串操作(取当前时间) string time=convert.tos ...
- String详解, String和CharSequence区别, StringBuilder和StringBuffer的区别
本章主要介绍String和CharSequence的区别,以及它们的API详细使用方法. 转载请注明出处:http://www.cnblogs.com/skywang12345/p/string01. ...
- 请别再拿“String s = new String("xyz");创建了多少个String实例”来面试了吧---转
http://www.iteye.com/topic/774673 羞愧呀,不知道多少人干过,我也干过,面壁去! 这帖是用来回复高级语言虚拟机圈子里的一个问题,一道Java笔试题的. 本来因为见得太多 ...
随机推荐
- word模版另存为网页(*.htm,*.html),转为jsp页面并加入数据后导出成word
word模版另存为网页之后,将html格式的文件转为jsp页面,在页面上加入相应的动态值,加入的值中包含图片,这个该怎么处理??另外导出的文件需要拷贝到不同的地方(无法联网)使用. <%@ pa ...
- jvm内存GC详解
一.相关概念 a. 基本回收算法 1. 引用计数(Reference Counting) 比较古老的回收算法.原理是此对象有一个引用,即增加一个计数,删除一个引用则减少一个计数.垃圾回收时,只用收 ...
- java synchronized与volatile的区别
java线程同步有两个特性,一个是可见性,一个是有序性.在解释这两个概念之前,先说下两个重要的概念,主内存(main memory)和工作内存(working memory),线 程之间数据的交互不是 ...
- SSH-KeyGen 的用法 【转载】
SSH-KeyGen 的用法 secureCrt通过密钥登录 做法:1.登录A机器 2.ssh-keygen -t [rsa|dsa],将会生成密钥文件和私钥文件 id_rsa,id_rsa.pub或 ...
- Eclipse快捷键调试
Eclipse中有如下一些和运行调试相关的快捷键Ctrl+Shift+B:在当前行设置断点或取消设置的断点 F11:调试最后一次执行的程序 Ctrl+F11:运行最后一次执行的程序F5:跟踪到 ...
- 保存网页MHT
uses ADODB_TLB, CDO_TLB, ComObj,MSHTML;{$R *.dfm}{能把网页如 WWW.QQ.COM保存为一个单文件 .MHT但不能把一个 A.HTM 保存为一个单文件 ...
- Cocos2d-x游戏中默认的AndroidManifest.xml的解析
直接上代码说明: <?xml version="1.0" encoding="utf-8"? > <!-- xmlns:android=&qu ...
- SQL高级优化之经常使用的优化策略-2(The Return Of The King)
1.2 索引 索引不是越多越好,你须要知道索引建立多了.写入数据的效率会减少.怎样使用索引要看你的项目的应用场景,做出合理的測试评估. 1.2.1 统计数量 统计数量上.假设字段(fieldName) ...
- memcpy的使用方法总结
1.memcpy 函数用于 把资源内存(src所指向的内存区域) 复制到目标内存(dest所指向的内存区域):拷贝多少个?有一个size变量控制拷贝的字节数:函数原型:void *memcpy(voi ...
- Linux学习笔记总结--memcached配置
Memcached是一个高性能的分布式的内存对象缓存系统,通过在内存里维护一个统一的巨大的hash表,它能够用来存储各种格式的数据,包括图像.视频.文件以及数据库检索的结果等.简单的说就是将数据调用到 ...