第10章 合理使用数据类型

合集下载

数据类型常用操作方法包括

数据类型常用操作方法包括

数据类型常用操作方法包括数据类型是计算机编程中最基本的概念之一,不同的数据类型具有不同的性质和操作方法。

下面我将分别介绍常见的数据类型及其常用操作方法。

一、数值类型(Numeric Types)1. 整型(Integer):表示整数值,可以进行加、减、乘、除、取余等常见的数学运算。

2. 浮点型(Float):表示带小数位的数值,同样可以进行数学运算,但注意浮点数运算可能存在精度问题。

3. 复数型(Complex):用于表示复数,可以进行加、减、乘、除的运算,获取实部和虚部等。

二、文本类型(String)1. 字符串(String):用于表示文本,可以用单引号或双引号括起来。

字符串可以进行拼接、复制、切片(获取子串)等,还可以转换大小写、替换字符、查找特定字符等操作。

三、序列类型(Sequence Types)1. 列表(List):用于存储多个元素的有序集合,可以包含不同类型的元素。

列表支持增加、删除、修改、切片等操作,包括追加元素、插入元素、删除元素、修改元素值。

2. 元组(Tuple):类似于列表,但元组是不可变的,即不能修改元素值。

元组也支持切片、索引操作,还可以解包(将元组的多个值赋给多个变量)。

3. 字符串(String):字符串也是序列类型的一种,具有和列表类似的操作方法,例如切片、索引等。

四、映射类型(Mapping Types)1. 字典(Dictionary):用于存储键值对的集合,其中每个元素都由键和对应的值组成。

字典支持增加、删除、修改元素,可以通过键获取对应的值,也可以遍历所有的键值对。

五、集合类型(Set Types)1. 集合(Set):用于存储不重复的元素的无序集合。

集合支持添加、删除元素,还可以求交集、并集、差集等操作。

六、布尔类型(Boolean Type)1. 布尔值(Boolean):表示真(True)和假(False)的值,通常用于逻辑判断和控制流程。

七、函数类型(Function Type)1. 函数(Function):函数也是一种数据类型,可以接受参数并返回结果。

MySQL数据类型详解及使用方法

MySQL数据类型详解及使用方法

MySQL数据类型详解及使用方法MySQL是一种广泛使用的关系型数据库管理系统,被广泛应用于各种规模的企业和个人项目中。

在MySQL中,数据类型是一项关键的概念,用于定义数据库表中的字段类型以及数据的存储方式。

本文将详细介绍MySQL中常用的数据类型及其使用方法,帮助读者更好地理解和运用MySQL。

一、字符型数据类型1. CHAR:CHAR数据类型用于存储固定长度的字符,最多可存储255个字符。

例如,可以使用CHAR(10)来存储一个固定长度为10个字符的字符串。

需要注意的是,如果实际存储的字符数少于指定的长度,MySQL会在末尾填充空格字符。

2. VARCHAR:VARCHAR数据类型用于存储可变长度的字符串,最多可存储65535个字符。

与CHAR不同,VARCHAR只会存储实际使用的字符数,不会占据固定的空间。

例如,可以使用VARCHAR(50)来存储最多长度为50的字符串。

3. TEXT:TEXT数据类型适用于存储大量文本数据,最多可存储65535个字符。

相比于VARCHAR,TEXT类型没有长度限制,适用于存储较长的文本数据,如文章内容或日志记录。

二、数值型数据类型1. INT:INT数据类型用于存储整数,范围为-2147483648到2147483647。

可以使用INT(11)来指定显示宽度,但实际存储的位数不受影响。

2. FLOAT:FLOAT数据类型用于存储单精度浮点数,适用于存储较小的浮点数。

可以使用FLOAT(p,d)来指定显示宽度和小数点位数,其中p表示总位数,d表示小数点后的位数。

3. DOUBLE:DOUBLE数据类型用于存储双精度浮点数,适用于存储较大的浮点数。

与FLOAT类似,可以使用DOUBLE(p,d)来指定显示宽度和小数点位数。

三、日期和时间型数据类型1. DATE:DATE数据类型用于存储日期,格式为YYYY-MM-DD。

例如,可以使用DATE来存储生日或注册日期等信息。

C语言详细教程(完整版)

C语言详细教程(完整版)

C语言详细教程(完整版)一、C语言概述C语言是一种广泛使用的高级编程语言,它具有简洁、高效、灵活的特点。

C语言广泛应用于系统编程、嵌入式系统、游戏开发、驱动程序等多个领域。

学习C语言,不仅可以让你掌握一种强大的编程工具,还可以帮助你理解计算机底层原理,提高编程能力。

二、C语言基本语法1. 数据类型C语言提供了丰富的数据类型,包括整型、浮点型、字符型等。

合理使用数据类型可以优化程序性能,提高代码可读性。

2. 变量与常量变量是程序中用于存储数据的标识符,而常量是在程序运行过程中值不会改变的量。

声明变量时需要指定其数据类型,常量可以使用define或const关键字定义。

3. 运算符C语言提供了丰富的运算符,包括算术运算符、关系运算符、逻辑运算符等。

熟练掌握运算符的使用可以提高编程效率。

4. 语句C语言中的语句用于控制程序执行流程,包括条件语句(if、switch)、循环语句(for、while、dowhile)等。

合理使用语句可以使程序结构清晰,易于维护。

5. 函数函数是C语言中的基本代码模块,用于实现特定的功能。

函数可以减少代码重复,提高程序的可读性和可维护性。

6. 数组数组是一种用于存储多个相同类型数据的数据结构。

C语言中的数组可以是一维、二维或多维的,合理使用数组可以优化内存使用。

7. 指针指针是C语言中用于存储变量地址的特殊数据类型。

指针可以用于动态分配内存、传递函数参数等,掌握指针的使用是提高编程能力的关键。

8. 字符串字符串是C语言中用于存储字符序列的数据结构。

C语言提供了丰富的字符串处理函数,如字符串复制、连接、比较等。

9. 文件操作C语言提供了丰富的文件操作函数,如文件打开、读取、写入、关闭等。

合理使用文件操作可以提高程序的数据处理能力。

10. 动态内存分配C语言提供了动态内存分配函数,如malloc、calloc、realloc等。

动态内存分配可以优化内存使用,提高程序性能。

三、C语言高级特性1. 结构体与联合体结构体和联合体是C语言中用于存储不同类型数据的复合数据类型。

变量与数据类型的使用技巧

变量与数据类型的使用技巧

变量与数据类型的使用技巧变量与数据类型的使用技巧在编程中,变量和数据类型是极其重要的概念。

变量存储着程序运行过程中的数据,数据类型则限定了这些数据的种类和取值范围。

正确使用变量和数据类型可以提高程序的可读性、可维护性和效率。

一、变量的命名规范变量命名不仅仅是一个表示,还可以更好的理解变量的含义,是良好编程习惯的体现。

变量名应该简洁、明了且易于理解。

当程序规模较大时,合理命名变量可以提高代码的可阅读性和可维护性。

根据编程语言的不同,变量名的命名规范也会有所不同,但是一些基本的规则是通用的:1.变量名应该使用有意义的名称,并且要尽量避免使用单个的字母或者数字作为变量名。

例如:age = 20 #不好的命名习惯user_age = 20 #好的命名习惯2.变量名称应该使用小写字母,如需要使用多个单词,可以使用下划线(_)或驼峰式命名法,但是在一个程序内部使用一致的方法是最好的。

例如:user_age #使用下划线userAge #使用驼峰式命名法3.避免使用关键字作为变量名。

例如:if = 5 #错误的命名方式,if是Python的关键字,不能作为变量名4.变量名长度应该适中,并且不能太长。

例如:user_desc = "John is a good person" #比下面的命名更简洁,但是不够精简user_description = "John is a good person" #命名简单、清晰、具有可读性二、数据类型的选择在编程中,正确选择合适的数据类型可以提高程序的效率,节省使用内存空间。

程序中一般使用的数据类型包括基本的数据类型和复杂数据类型。

1.整型(int):表示整数类型数据。

在Python中,整数没有大小限制,可以是正数、负数和零。

在其他编程语言中,通常有不同的整型,如short、long、ulong等。

例如:a = 10 #定义整型变量a2.浮点型(float):表示浮点类型数据,可以使用小数表示数值。

编写高效的Java代码技巧

编写高效的Java代码技巧

编写高效的Java代码技巧章节一:优化算法选择在编写高效的Java代码时,选择合适的算法是至关重要的。

对于不同的问题,可以采用不同的算法来解决。

在选择算法时,需要考虑问题的规模、时间复杂度和空间复杂度等因素。

一般来说,快速排序、二分查找和动态规划等算法是常用的高效算法。

通过分析问题的特点,选择合适的算法可以大大提高代码的效率。

章节二:合理使用数据结构和集合类在Java中,数据结构和集合类是编写高效代码的重要工具。

合理地选择和使用数据结构和集合类可以提高代码的执行效率。

例如,在查找和排序方面,可以使用HashMap和TreeSet等集合类,通过合理地选择数据结构和集合类,可以大大减少代码的复杂度,提高代码的效率。

章节三:避免过多的对象创建在Java中,对象的创建和销毁是比较耗费资源的操作。

为了提高代码的效率,应尽量避免过多的对象创建。

一种常见的做法是通过对象池或者缓存来重用对象,减少对象的创建和销毁次数,从而提高代码的执行效率。

章节四:合理使用循环和条件语句循环和条件语句是程序中非常常见的语法结构。

在使用循环和条件语句时,需要注意合理的使用方式,避免不必要的循环和条件判断。

例如,在循环中,可以根据具体问题的需求,选择合适的循环方式,如for循环、while循环和do-while循环等。

在条件语句中,可以通过合适的判断条件和逻辑操作符,简化代码逻辑,提高代码的可读性和执行效率。

章节五:使用适当的数据类型在Java中,数据类型的选择与代码的执行效率密切相关。

根据具体的需求,选择合适的数据类型可以提高代码的执行效率。

例如,对于整数相关的计算,可以使用int类型而不是使用Integer类型,因为int类型在计算时比Integer类型更加高效。

此外,对于浮点数的计算,可以使用float类型而不是double类型,因为float类型在计算时相对更高效。

章节六:合理使用异常处理异常处理是Java中的一种重要的错误处理机制。

数据库中的数据类型及其在存储过程中的应用

数据库中的数据类型及其在存储过程中的应用

数据库中的数据类型及其在存储过程中的应用在数据库系统中,数据类型是用来定义数据的格式和范围的重要概念。

不同的数据类型在存储过程中起着不同的作用,能够满足各种数据存储和处理的需求。

本文将介绍常见的数据库数据类型,并探讨其在存储过程中的应用。

一、数值型数据类型1. 整型(Integer)整型是一种用来存储整数的数据类型。

根据需求的精度,整型可以分为不同的子类型,如小整数(tinyint)、短整数(smallint)和长整数(int)。

在存储过程中,整型数据类型经常用来表示数量、计数和标识符等。

2. 小数型(Decimal)小数型是一种用来存储小数的数据类型,它可以定义精确到小数点后的位数。

小数型经常被用来表示货币金额和精确的浮点数。

在存储过程中,小数型数据类型可以进行数学运算和比较操作,以满足计算和筛选的需求。

二、字符型数据类型1. 字符串(String)字符串数据类型存储文本信息,可以包含字母、数字和特殊字符。

字符串类型可以分为不同子类型,如定长字符(char)和变长字符(varchar)。

在存储过程中,字符串类型经常用来存储用户输入的文本数据,如姓名、地址和描述等。

2. 文本(Text)文本数据类型适用于存储较大的文本信息,如文章内容、日志和评论。

文本类型能够存储更多的字符,且没有固定的长度限制。

在存储过程中,文本类型可以用于存储长文本数据,以方便进行搜索和分析操作。

三、日期与时间型数据类型1. 日期(Date)日期数据类型用于存储年、月、日信息。

日期类型可以表示特定日期,如生日、交易日期等。

在存储过程中,日期类型经常被用来进行日期计算和日期筛选操作。

2. 时间(Time)时间数据类型用于存储特定的时间,包括小时、分钟和秒。

时间类型经常用于记录事件发生的具体时间。

在存储过程中,时间类型可以用来计算时间间隔和时间排序等操作。

四、二进制型数据类型1. 二进制(Binary)二进制数据类型用于存储二进制数据,如图像、视频和声音文件等。

学习计算机编程中的数据类型与变量的使用

学习计算机编程中的数据类型与变量的使用

学习计算机编程中的数据类型与变量的使用数据类型与变量的使用是计算机编程中的基础知识之一。

在学习计算机编程的过程中,了解和掌握不同的数据类型以及如何正确地使用变量对数据进行存储和处理是非常重要的。

本文将介绍常见的数据类型以及变量的使用方法,帮助读者加深对这个主题的理解。

一、数据类型的概念及分类在计算机编程中,数据类型是指变量所能存储的数据的种类。

不同的数据类型具有不同的特征和用途。

常见的数据类型主要包括整型、浮点型、字符型和布尔型等。

1. 整型数据类型整型数据类型用于存储整数,可以表示正数、负数、零和小数点之前的数。

在不同的编程语言中,整型数据类型的表示方式可能有所不同,常见的整型数据类型有int、long、short等。

例如,在Java中,可以使用int来声明一个整型变量,其取值范围为-2147483648到2147483647。

2. 浮点型数据类型浮点型数据类型用于存储小数,可以表示实数或者近似值。

与整型数据类型不同,浮点型数据类型可以表示小数点之前和之后的数。

在不同的编程语言中,浮点型数据类型的表示方式可能有所不同,常见的浮点型数据类型有float、double等。

例如,在C++中,可以使用float来声明一个浮点型变量,其精度为6位小数。

3. 字符型数据类型字符型数据类型用于存储单个字符,包括字母、数字、符号等。

在不同的编程语言中,字符型数据类型的表示方式可能有所不同,常见的字符型数据类型有char等。

例如,在Python中,可以使用char来声明一个字符型变量,其取值范围为Unicode字符集。

4. 布尔型数据类型布尔型数据类型用于存储逻辑值,即“真”或者“假”。

在不同的编程语言中,布尔型数据类型的表示方式可能有所不同,常见的布尔型数据类型有bool等。

例如,在C#中,可以使用bool来声明一个布尔型变量,其取值只能是true或false。

二、变量的定义和使用方法变量是计算机内存中用于存储数据的一块区域,可以在程序中随时改变其值。

数据类型知识点总结

数据类型知识点总结

数据类型知识点总结数据类型是程序设计中非常重要的一部分,它定义了数据的组织方式和可操作性,是程序设计语言的基础部分。

在计算机领域中,数据类型可以分为基本数据类型和复合数据类型。

本文将详细介绍这些数据类型的知识点并进行总结。

基本数据类型基本数据类型是程序设计语言提供的最基本的数据类型,它们定义了程序中可以使用的基本数据。

通常包括整数类型、浮点数类型、字符类型和布尔类型等。

1. 整数类型整数类型表示不带小数部分的数字,可以分为有符号整数和无符号整数。

常见的有符号整数类型有int、long和short等,它们的取值范围和精度有所不同;而无符号整数类型则不包含负数,常见的无符号整数类型有unsigned int、unsigned long和unsigned short等。

在不同的编程语言中,这些整数类型可能会有所差异,需要根据具体的语言规范来进行选择和使用。

2. 浮点数类型浮点数类型表示带有小数部分的数字,通常包括单精度浮点数和双精度浮点数。

单精度浮点数通常使用float类型表示,双精度浮点数通常使用double类型表示。

这些类型的数据通常用于表示具有小数部分的数值,例如科学计算、金融计算等。

3. 字符类型字符类型表示单个字符,通常使用char类型表示。

在计算机中,字符是以ASCII码或Unicode编码进行表示的,不同的编程语言可能会有不同的字符表示方式,但通常情况下都是使用char类型来表示单个字符的数据。

4. 布尔类型布尔类型表示逻辑值,通常只有两个取值,即true和false。

在不同的编程语言中,布尔类型的表示方式可能会有所不同,但它们都是用来表示逻辑真假的数据类型。

复合数据类型复合数据类型是由基本数据类型构建而成的数据类型,它可以包含多个基本数据类型的数据元素,以构建更加复杂和丰富的数据结构。

常见的复合数据类型包括数组、结构体和枚举等。

1. 数组数组是一种由相同类型的数据元素构成的有序集合,它可以包含多个元素,这些元素可以通过下标进行访问。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

第10章合理使用数据类型在进一步讨论更深的主题之前,我们需要先停一停,快速地回顾一下可移植问题。

Linux1.2版本和2.0版本之间的不同就在于额外的多平台能力;结果是,大多数源代码级的移植问题已经被排除了。

这意味着一个规范的Linux驱动程序也应该是多平台的。

但是,与内核代码相关的一个核心问题是,能够同时存取各种长度已知的数据项(例如,文件系统数据类型或者设备卡上的寄存器)和利用不同处理器的能力(32位和64位的体系结构,也有可能是16位的)。

当把x86的代码移植到新的体系结构上时,核心开发者遇到的好几个问题都和不正确的数据类型相关。

坚持强数据类型以及编译时使用-Wall-Wstrict-prototypes选项能够防止大部分的臭虫。

内核使用的数据类型划分为三种主要类型:象int这样的标准C语言类型,象u32这样的确定数据大小的类型和象pid_t这样的接口特定类型。

我们将看一下这三种类型在何时使用和如何使用。

本章的最后一节将讨论把驱动器代码从x86移植到其它平台上可能碰到的其它一些典型问题。

如果你遵循我提供的这些准则,你的驱动程序甚至可能在那些你未能进行测试的平台上编译并运行。

使用标准C类型大部分程序员习惯于自由的使用诸如int和long这样的标准类型,而编写设备驱动程序就必须细心地避免类型冲突和潜在的臭虫。

问题是,当你需要“2个字节填充单位(filler)”或“表示4个字节字符串的某个东西”时,你不能使用标准类型,因为通常的C数据类型在不同的体系结构上所占空间大小并不相同。

例如,长整数和指针类型在Alpha上和x86上所占空间大小就不一样,下面的屏幕快照表明了这一点:morgana%./datasizesystem/machine:Linux i486sizeof(char)=1sizeof(short)=2sizeof(int)=4sizeof(long)=4sizeof(longlong)=8sizeof(pointer)=4wolf%./datasizesystem/machine:Linux alphasizeof(char)=1sizeof(short)=2sizeof(int)=4sizeof(long)=8sizeof(longlong)=8sizeof(pointer)=8sandra%./datasizesystem/machine:Linux sparcsizeof(char)=1sizeof(short)=2sizeof(int)=4sizeof(long)=4sizeof(longlong)=8sizeof(pointer)=4datasize程序是一个可以从在O'Reilly FTP站点的misc-progs目录下获得的小程序。

在混合使用int和long类型时,你必须小心,有时有很好的理由这样做,一种情形就是内存地址,一涉及到内核,内存地址就变得很特殊。

虽然概念上地址是指针,但是通过使用整数类型,可以更好地实现内存管理;内核把物理内存看做一个巨大的数组,内存地址就是这个数组的索引。

而且,一个指针很容易被取地址(deference),而使用整数表示内存地址可以防止它们被取地址,这正是人们所希望的(比使用指针更安全)。

因而,内核中的地址属于unsigned long类型,这是利用了指针和长整数类型大小总是相同这一事实,至少在所有Linux当前支持的平台上是这样的。

我们等着看看将来把Linux移植到不符合这一规则的平台上的时候,会发生些什么。

分配确定的空间大小给数据项有时内核代码需要指定大小的数据项,或者用来匹配二进制结构*或者用来在结构中插入填充字段对齐数据。

为此目的,内核提供如下的数据类型,它们都在头文件<asm/types.h>中声明,这个文件又被头文件<linux/types.h>所包含:u8;/*无符号字节(8位)*/u16;/*无符号字(16位)*/u32;/*无符号32位数值*/u64;/*无符号64位数值*/*读分区表时,执行二进制文件时或者解码一个网络包时,就会发生这种情况。

这些数据类型只能被内核代码所访问(也即,在包含头文件<linux/types.h>之前必须先定义__KERNEL__)。

相应的有符号类型也是存在的,但一般不用;如果你需要使用它们的话,只要把名字中的u替换为s就可以了。

如果用户空间的程序需要使用这些类型,可以在这些名字前面添加2个下划线:__u8和其它类型是独立于__KERNEL__定义的。

例如,如果一个驱动程序需要通过ioctl系统调用与一个运行在用户空间内的程序交换二进制结构的话,头文件必须将结构中的32位字段定义为__u32。

重要的是要记住这些类型特定于Linux,使用它们就会防碍软件向其他Unix变体的移植。

但是,有些情况下也需要明确说明数据大小,而标准头文件(在每个Unix系统上都能找到的)并未声明较合适的数据类型。

你也许注意到,有时内核也使用一般的数据类型,象unsigned int,用于那些大小与体系结构无关的项。

这通常是为了向后兼容。

当u32及其相关类型在1.1.67版本引入时开发者没办法把存在的数据类型改成新类型,因为当结构字段和赋予的值之间类型不匹配时,编译器会发出警告+。

Linus当初可没预料到为自己使用而编写的这个操作系统会发展成为多平台的;因此,一些旧的结构的数据类型定义上不是很严格。

接口特定的类型内核中最常使用的数据类型有它们自己的typedef声明,这样就防止了任何移植上的问题。

例如,进程号(pid)通常使用pid_t,而不是int。

使用pid_t屏蔽了任何实际数据类型之间可能的差别。

我使用“接口特定”这种表述来指代特定数据项的编程接口。

属于指定“标准”类型的其它数据项也可以认为是接口特定的。

比如,一个jiffy计数总是属于unsigned long类型的,独立于它的实际大小-你喜欢那么频繁地使用jiffy_t 类型么?这里我关注的是接口特定类型的第一类,那些以_t结尾的类型。

_t类型完整的列表在头文件<linux/types.h>中,但是该列表几乎没什么用。

当需要一个特定类型时,你可以在你要调用的函数原型或者使用的数据结构中找到它。

只要你的驱动程序使用了需要这种“定制”类型的函数,又不遵循惯例的时候,编译器都会发出一个警告;如果你打开-Wall编译开关并且细心地去除了所有警告,你就可以自信你的代码是可移植的了。

_t数据项的主要问题是当你需要打印它们的时候,并不总是容易选择正确的printk或者printf格式,并且你在一种体系结构上排除了的警告,在另一种体系结构上可能又会出现。

例如,当size_t在一些平台上是unsigned long,而在另外一些平台上却是unsigned int时,你怎么打印它呢?+实际上,即使两种类型仅是同一对象的不同名字,例如PC上的unsigned long和u32类型,编译器也会发出类型不匹配的信号。

任何时候,当你需要打印一些特定接口的数据的时候,最行之有效的方法就是,把它强制转换成最可能的类型(通常是long或unsigned long类型),然后把它用相应的格式打印出来。

这种做法不会产生错误或者警告,因为格式和类型相符,而且你也不会丢失数据位,因为强制类型转换要么是个空操作,要么是将该数据项向更大数据类型的扩展。

实际上,通常我们并不会去打印我们讨论的这些数据项,因此只有显示调试信息时才会碰到这些问题。

更经常的,除了把接口特定的类型作为参数传递给库或内核函数以外,代码仅仅只会对它们进行些储存和比较。

虽然大多数情形下,_t类型都是正确的解决方案,但有时候正确的类型也可能并不存在。

这会发生在一些还没被抛弃的旧接口上。

在内核头文件中我发现一处疑点,为I/O函数声明数据类型时不是很严格(参见第8章“硬件管理”中的“平台相关性”一节)。

这种不严格的类型定义主要是出于历史上的原因,但在编写代码时却会带来问题。

就我而言,我经常在把参数交换给out函数时遇上麻烦;而如果定义了port_t,编译器将会指出这些错误。

其它与移植有关的问题除了数据类型定义问题之外,如果想让你编写的驱动程序能在不同的Linux平台间移植的话,还必须注意到其它一些软件上的问题:时间间隔在处理时间间隔时,不能假定每秒一定有100个jiffy。

虽然对当前的Linux-x86而言这是对的,但并不是所有Linux平台都是以100HZ运行。

如果你改变了HZ的数值,那么即使对x86,这种假设也是错误的,何况没人知道未来的内核会发生些什么变化。

使用jiffy计算时间间隔的时候,应该把时间转换成以HZ为单位。

例如,为了检测半秒钟的超时,可以把消逝的时间和HZ/2作比较。

更常见的,与msec毫秒对应的jiffy的数目总是msec*HZ/1000。

许多的网络驱动程序在移植到Alpha上时都必须修正该细节;有些开始是为PC设计的驱动程序给超时明确定义了一个jiffy值,但是Alpha却有着不同的HZ数值。

页大小使用内存时,要记住内存页的大小为PAGE_SIZE字节,而不是4KB。

假设页大小就是4KB并硬编码该数值是PC程序员常犯的错误-Alpha页大小是这的两倍。

相关的宏有PAGE_SIZE和PAGE_SHIFT。

后者包含要得到一个地址所在页的页号时需要对该地址右移的位数。

对当前的4KB和8KB的页,这个数值通常是12或者13。

这些宏在头文件<asm/page.h>中定义。

让我们来看一种简单的情况。

如果驱动程序需要16KB空间来存放临时数据,它不应当指定get_free_pages函数的参数order(“2”的幂)。

需要一种可移植的解决办法。

此时,可以使用条件编译#ifdef__alpha__,但这只适用于已知的平台,而如果要支持别的平台,它就不能奏效了。

我建议使用下面的代码:buf=get_free_pages(GFP_KERNEL,14-PAGE_SHIFT,0/*dma*/);或者,更好一些的代码:int order=(14-PAGE_SHIFT>0)?14-PAGE_SHIFT:0;buf=get_free_pages(GFP_KERNEL,order,0/*dma*/);两种解决办法都利用了16KB等于1<<14这一常识。

两个数的商就是它们对数的差(的幂),而14和PAGE_SHIFT都是幂。

第二种解决办法就更好,因为它可以防止把一个负的order值传递给get_free_pages函数;order值时在编译时就计算好的,没有运行时的额外开销,而且,上面给出的实现方法是不依赖于PAGE_SIZE来分配任何2的幂次大小的内存空间的安全方法。

相关文档
最新文档