首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

为什么在参数声明中只能使用"register“存储类说明符?

在参数声明中只能使用"register"存储类说明符的原因是,参数传递的方式和存储位置是由编译器决定的。在函数调用时,参数通常会被复制到寄存器或栈中,以便在函数内部使用。而寄存器是一种存储速度非常快的存储器,可以提高程序的执行效率。

使用"register"存储类说明符可以向编译器建议将参数存储在寄存器中,以便更快地访问和操作参数。然而,由于寄存器的数量是有限的,而且编译器可能会根据需要将其他变量存储在寄存器中,所以并不是所有的参数都能被存储在寄存器中。

此外,现代的编译器通常能够根据代码的优化策略自动选择最佳的存储位置和传递方式,因此在参数声明中使用"register"存储类说明符的效果可能会因编译器和优化策略的不同而有所差异。

总结起来,参数声明中只能使用"register"存储类说明符是为了向编译器建议将参数存储在寄存器中,以提高程序的执行效率。然而,具体是否采纳这个建议还是由编译器决定。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

【C】Storage Class

什么是Storage Class Storage Class翻译成中文为存储(总感觉翻译成汉语不太好),用来修饰C变量和函数。如果没有显式的指定storage class,会使用默认值。...auto register static extern typedef 需要注意的是我们一个声明,我们至多使用一个storage class的说明符。...如果没有显示使用说明符,则会使用以下的默认规则: 函数内部声明的变量默认使用 auto 说明符 函数内部声明的函数默认使用 extern 说明符 函数外部声明的变量和函数默认使用static说明符...Storage Class 类别(Type) 根据上面所说,C中一共有四storage class: Automatic Storage Class Register Storage Class Static...同时需要注意的是,register变量不能使用取地址符’&’,因为按照标准它是存储寄存器的,并没有内存的地址,所以下面的代码是编译不过的 #include int main()

75300

C++变量的存储说明符和cv-限定符

C++创建变量时,前面有时会有一些修饰符,这里总结一下。 大体分为两个类别:存储说明符和cv-限定符。...存储说明符 存储说明符有下面这些: auto register static extern mutable auto修饰符的变量时自动变量,如果变量没有任何修饰符,默认就是自动变量,其作用域函数内部。...register修饰变量将创建一个寄存器变量,理念在于CPU访问寄存器的值比访问普通存储堆栈的值速度要快,声明方法: register int count_fast; 需要注意的是,编译器并不一定会满足将变量放在寄存器的要求...),要么用static声明来隐藏这个大全局global(此时是新的变量) static int one_file = 50;// 函数外使用static声明,只文件内各个函数可使用 void func...(int n) { static int count = 0;// 函数内用static声明只能在函数内使用,但是无论函数是否执行,变量都存在,且多次调用时其值不会重新初始化,而是保持上一次的结果

59110

c++存储

C++ 存储 存储定义 C++ 程序变量/函数的范围(可见性)和生命周期。这些说明符放置它们所修饰的类型之前。...C++ 存储说明符,且 register 关键字被弃用。...(9); // int* auto x1 = 5, x2 = 5.0, x3='r';//错误,必须是初始化为同一register 存储 register 存储用于定义存储寄存器而不是 RAM...还应注意的是,定义 'register' 并不意味着变量将被存储寄存器,它意味着变量可能存储寄存器,这取决于硬件和实现的限制。...thread_local 存储 使用 thread_local 说明符声明的变量仅可在它在其上创建的线程上访问。 变量创建线程时创建,并在销毁线程时销毁。 每个线程都有其自己的变量副本。

60050

c++存储

C++ 存储存储定义 C++ 程序变量/函数的范围(可见性)和生命周期。这些说明符放置它们所修饰的类型之前。...C++98标准auto关键字用于自动变量的声明,但由于使用极少且多余, C++17 已删除这一用法。...; // int*auto x1 = 5, x2 = 5.0, x3='r';//错误,必须是初始化为同一register 存储register 存储用于定义存储寄存器而不是 RAM 的局部变量...还应注意的是,定义 'register' 并不意味着变量将被存储寄存器,它意味着变量可能存储寄存器,这取决于硬件和实现的限制。...thread_local 存储使用 thread_local 说明符声明的变量仅可在它在其上创建的线程上访问。 变量创建线程时创建,并在销毁线程时销毁。 每个线程都有其自己的变量副本。

70020

存储类别、链接和内存管理(二)

默认情况下,声明块或函数头中的任何变量都属于自动存储类别。使用auto作为存储类别说明符。 再复习一下: 无链接意味着这些变量属于定义它们的块、函数或原型私有。...二、寄存器变量 函数头中使用关键字register,便可请求寄存器变量。 它们都是块作用域、无链接和自动存储期。...也就是说,这种变量具有块作用域、无链接,但是具有静态存储期。计算机多次函数调用之间会记录它们的值。(提供块作用域和无链接)以存储类别说明符static(提供静态存储期)声明这种变量。...把变量的定义性声明(defining declaration)放 在在所有函数的外面便创建了外部变量。当然,为了指出该函数使用了外部 变量,可以函数中用关键字extern再次声明。...units具有文件作用域、外部链接和静态存储期。所以即使我们main函数里没有声明uints,程序一样可行。来看看注释掉extern声明。 再看看 为什么会这样?

48720

CCPP的auto关键字对比分析

引入 auto是C语言的一个关键字,关键字主要用于声明变量的生存期为自动,即将不在任何、结构、枚举、联合和函数定义的变量视为全局变量,而在函数定义的变量视为局部变量。...C语言中提供了存储说明符auto,register,extern,static说明的四种存储类别。四种存储类别说明符有两种存储期:自动存储期和静态存储期。其中auto和register对应自动存储期。...具有自动存储期的变量进入声明该变量的程序块是被建立,它在该程序块活动时存在,退出该程序块时撤销。 语言中包括了关键字auto,它可用于定义局部变量。...C语言中使用auto关键字声明一个变量为自动变量,是C语言中应用最广泛的一种类型,函数内定义变量时,如果没有被声明为其他类型的变量都是自动变量,也就是说,省去类型说明符auto的都是自动变量。...编程时通常需要把表达式值式赋给变量,这就要求声明变量时清楚的知道表达式的类型,C++11新标准引入了auto 类型说明符,让编译器去分析表达式的类型。

81720

C语言自学(一)C语言基础

if 条件语句 int 声明整型变量或函数 long 声明长整型变量或函数返回值类型 register 声明寄存器变量 return 子程序返回语句 short 声明短整型变量或函数...用于给数据类型取别名 unsigned 声明无符号类型变量或函数 union 声明共用体类型 void 声明函数无返回值或无参数声明无类型指针 volatile 说明变量程序执行可被隐含地改变...while 循环语句的循环条件 C数据类型 1、基本类型 它们是算数类型,包括俩种类型:整数类型和浮点类型 2、枚举类型 它们也是算数类型,被用来定义程序只能赋予其一定的离散 整数值变量...整数类型的存储大小的值范围 ? 浮点类型的存储大小、值范围和精度 ? void类型指定没有可用的值,它通常用于以下三种情况 ?...回车 C存储 auto register static extern C运算符 算术运算符 + - * / % ++ – 关系运算符 == !

22.3K21

利用Clang探究__block的本质

那么问题来了,为什么被__block说明符修饰的变量就可以block函数体内部访问呢?__block底层究竟对被修饰的变量做了什么呢?__block是如何将“外部变量”从栈中转移到堆?...其中,构造函数后面的: val(_val->__forwarding)是初始化列表,初始化列表是C++特有语法,初始化列表只能使用在构造函数。...static auto register auto表示修饰的变量作为局部变量存储,这是函数或方法内部默认的声明方式,一般不用添加。...这也就是为什么上面声明num的同时也对num进行了定义。...一个文件内定义的全局变量,另一个文件,通过extern声明全局变量,就可以使用全局变量;static修饰的全局静态变量,作用域是声明此变量所在的文件。

7.3K20

全国二级C知识点总结5-函数

(调用函数时函数名后面括号参数) l 形参本函数体内都可以使用,离开该函数则不能使用。...C)同名的实参和形参占同一存储单元 D)函数的形参和实参分别占用不同的存储单元 【解析】本题考点是函数的参数定义,函数,主调数里边的参数叫做实参,而被调函数里边的参数叫做形参,当函数传递时,...; 【解析】本题考点是对函数的声明函数声明的时候,其格式如下:返回值类型函数名(参数类型[参数名],参数类型[参数名]……)其中,参数名可以不写,但是参数类型一定要写全 l 省去主调函数对被调函数的函数说明的几种情况...Ø 寄存器变量(register): 例1、(08-04-39)C语言中,只有使用时才占用内存单元的变量,其存储类型是( A )。...每一标准库函数是C语言本身提供的,用户不能重新定义标准库函数。 12、知识点:数组与函数 l 数组用作函数参数有两种形式:把数组元素(下标变量)作为实参使用和把数组名作为函数的形参和实参使用

2K20

C语言符号意思(看了必懂系列)「建议收藏」

auto :声明自动变量 一般不使用 double :声明双精度变量或函数 int: 声明整型变量或函数 struct:声明结构体变量或函数 break:跳出当前循环 else :条件语句否定分支...(当然还有其他作用) char :声明字符型变量或函数 extern:声明变量是在其他文件正声明(也可以看做是引用变量) return :子程序返回语句(可以带参数,也看不带参数) union:...;对o输出时加前 缀o 对x输出时加前缀0x;对e,g,f 当结果有小数时才给出小数点 格式字符串 格式字符串的一般形式为: %[*][输入数据宽度][长度]类型 其中有方括号[]...C语言中,对变量的存储类型说明有以下四种: auto 自动变量 register 寄存器变量 extern 外部变量 static 静态变量 自动变量和寄存器变量属于动态存储方式, 外部变量和静态变量属于静态存储方式...介绍了变量的存储类型之后, 可以知道对一个变量的说明不仅应说明其数据类型,还应说明其存储类型。

1.5K20

C语言三剑客之《C专家编程》一书精华提炼

----确实如此 register关键字,这个设计可以说是一个失误,如果让编译器使用各个变量时自动处理寄存器的分配工作,显然比一经声明就把这类变量在生命周期内始终保留在寄存器里要好,使用register...这也是为什么C++语言令人失望的原因:它对C语言中存在的一些最基本问题没有什么改进,而它对C语言最重要的扩展()却是建立脆弱的C类型模型上。...以下形式: 标识符 或 标识符[下标] 或 标识符(参数) 或 (声明器) ----注意括号不能乱加,就两个地方可以加括号 声明格式:类型说明符 声明器[,声明器]; 类型说明符: int char void...等 存储类型: extern static register auto 类型限定符: const volatile 理解C语言声明的优先级规则 A 声明从它的名字开始读取,然后按照优先级顺序依次读取。...auto关键字几乎没什么用处,因为它只能用于函数内部,但是函数内部声明的数据缺省就是这种分配。 setjmp和longjmp,C++变异为更普通的异常处理机制“catch”和“throw”。

2.3K50

江哥带你玩转C语言 | 15- 修饰符和预处理指令

存储位置:静态存储区 特点: 多个同名的全局变量指向同一块存储空间 ---- auto和register关键字 auto关键字(忘记) 只能修饰局部变量, 局部变量如果没有其它修饰符, 默认就是auto...的 特点: 随用随开, 用完即销 auto int num; // 等价于 int num; register关键字(忘记) 只能修饰局部变量, 原则上将内存变量提升到CPU寄存器存储, 这样访问速度会更快...外部变量:可以在其他文件访问的变量,默认所有全局变量都是外部变量 默认情况下多个同名的全局变量共享一块空间, 这样会导致全局变量污染问题 如果想让某个全局变量只某个文件中使用, 并且不和其他文件同名全局变量共享同一块存储空间...内部函数:只能在本文件访问的函数 外部函数:可以本文件以及其他的文件访问的函数 默认情况下所有的函数都是外部函数 static 作用 声明一个内部函数 static int sum(int...; return 0; } ---- 带参数的宏定义 C语言允许宏带有参数宏定义参数称为形式参数,宏调用参数称为实际参数

1K00

最全的C语言基础知识梳理总结

函数定义的一般形式: (1)类型标志符 函数名() { 声明部分 语句 } (2)类型标志符 函数名(形式参数列表) { 声明部分 语句 } 关于形参和实参的说明: (1) 定义函数中指定的形参,未出现函数调用时...3、如果使用用户自己定义的函数,而且该函数与使用它的函数同一个文件,一般还应该在主调函数对被调用的函数做声明。 4、如果被调用的函数定义出现在主调函数之前可以不必声明。...,一般不再必要时不要使用,他程序的全部执行过程占用存储单元,是函数的通用性,使用全局变量会使程序的清晰性降低。...,程序开始时分配空间,完毕时释放;动态存储存放以下数据:1、函数形式参数;2、自动变量;3、函数调用时的现场保护和返回地址;C语言中每个变量和函数都有两个属性,是数据类型和数据存储类型,存储类别是数据在内存存储的方式...存储方式分为静态和动态存储,具体包含有四种:自动的(auto),静态的(static),寄存器的(register),外部的(extern),如果不加以声明,就自认为是auto型就会自动分配存储空间属于动态存储方式

2K40

C++ const各种用法总结

[*注意*]但这只对于内部类型而言(因为内部类型返回的肯定是一个值,而不会返回一个变量,不会作为左值使用,否则编译器会报错),对于用户自定义类型,返回值是常量是非常重要的(后面里面会谈到)。...3.修饰对象 const A a; // 对象a 只能调用const 成员函数,否则编译器报错。...七 使用const的一些建议 1.要大胆的使用const,这将给你带来无尽的益处,但前提是你必须搞清楚原委; 2.要避免最一般的赋值操作错误,如将const变量赋值; 3.参数使用const应该使用引用或指针...,而不是一般的对象实例,原因同上; 4.const成员函数的三种用法(参数、返回值、函数)要很好的使用; 5.不要轻易的将函数的返回值类型定为const; 6.除了重载操作符外一般不要将返回值类型定为对某个对象的...编译器通常不为普通const常量分配存储空间,而是将它们保存在符号表,这使得它成为一个编译期间的常量,没有了存储与读内存的操作,使得它的效率也很高。

1.9K10

C++ 炼气期之变量的生命周期和作用域

如在源代码文件声明的变量能在整个文件中使用(文件级别作用域),声明的变量能在使用级别作用域)、名称空间中声明的变量可以整个名称空间内使用。...变量的声明位置也决定了变量在内存存储位置,如函数体内声明的局部变量一般会存储,如声明的变量存储,文件声明的全局变量存储全局\静态存储区。...函数的参数、函数体内声明的变量都会存储,栈的特点是由运行时系统自动分配与释放,另栈分配空间是向高地址向低地址扩张。 堆:堆是一个自由、开放式存储空间。...外部文件可使用指在另一个文件也可以使用。 如果要在文件的外部使用,需要使用 extern变量说明符。如下图,保证 main.cpp 和extern.cpp 2 个文件同一个项目中。...如下代码,文件 extern.cpp声明了一个使用 static关键字说明的变量 guoKe_。 其使用范围只能 extern.cpp文件

86430

C++的作用域与生命周期

- 注意:成员函数可以定义体内,即定义头文件,当被不同源文件包含时不会报重定义的错误,因为作用域被限制。...- 引用方法:其他文件要先进行函数原型声明,再使用。 - 内存分布:代码区。 - 注意:如果在两个源文件定义了同名的全局函数,连接时会出现重定义错误。...全局变量: - 作用域:全局作用域(全局变量只需一个源文件定义,就可以作用于所有的源文件); - 生命周期:程序运行期一直存在; - 引用方法:其他文件使用必须用extern 关键字声明要引用的全局变量...,register,extern,static说明的四种存储类别。...四种存储类别说明符有两种存储期:自动存储期和静态存储期。其中auto和register对应自动存储期。具有自动存储期的变量进入声明该变量的程序块是被建立,它在该程序块活动时存在,退出该程序块时撤销。

1.1K20

C语言基础知识梳理总结

3、如果使用用户自己定义的函数,而且该函数与使用它的函数同一个文件,一般还应该在主调函数对被调用的函数做声明。   4、如果被调用的函数定义出现在主调函数之前可以不必声明。   ...局部变量和全局变量: 1、局部变量一个函数内部定义的变量是内部变量,它只是本函数范围内的有效,主函数也不能使用其它函数定义的变量;不同函数可以使用相同的名字的变量,他们代表不同的对象...,全局变量可以增加函数间数据联系的渠道,一般不再必要时不要使用,他程序的全部执行过程占用存储单元,是函数的通用性,使用全局变量会使程序的清晰性降低。...存储方式分为静态和动态存储,具体包含有四种: 自动的(auto); 静态的(static); 寄存器的(register); 外部的(extern...register变量是C语言中允许将局部变量的值放在CPU的寄存器需要时直接从寄存器取出来参加运算,不必再到内存中提取,但是计算机系统寄存器数量有限,不能任意定义任意多的存储器,局部静态变量不能定义为寄存器变量

71210

C 语言用户输入详解:scanf、fgets、内存地址解析及实用指南

,您必须指定字符串/数组的大小(本例我们使用了一个非常高的数字 30,但至少可以确定它可以存储足够的名字首字母),并且您不必使用引用运算符 (&)。...这就是为什么处理字符串时,我们经常使用 fgets() 函数来读取一行文本。...内存地址是变量计算机内存存储的位置。当我们为变量赋值时,值就存储在这个内存地址。...您的程序,您可能不会得到相同的结果,因为这取决于变量计算机内存存储位置。 您还应该注意,&myAge 通常被称为 "指针"。指针基本上是将变量的内存地址作为其值存储。...要打印指针值,我们使用 %p 格式说明符为什么知道内存地址有用? 指针 C 语言中很重要,因为它们允许我们操作计算机内存的数据 - 这可以减少代码量并提高性能。

35610
领券