存储持续性、作用域和链接性

本文介绍了C++中的四种存储持续性:自动、静态、线程和动态,并详细解释了自动变量和栈、静态持续变量的概念及初始化过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

关于内存的知识:c++使用3种(c++11中是4种)不同的方案来存储数据,这些方案的区别在于数据保留在内存中的时间。

  • 自动存储持续性:在默认情况下,在函数中声明的函数参数和变量的存储持续性为自动,作用域为局部,没有链接性,也就是说,在代码块和函数内部定义的变量只在该代码块和函数中起作用。c++有2种存储持续性为静态的变量。
  • 静态存储持续性:在函数定义外定义的变量和使用关键字static定义的变量的存储持续性都是静态的。他们在整个函数运行过程中都存在。c++有3种存储持续性为静态的变量。
  • 线程存储持续性:
  • 动态存储持续性:用new运算符分配的内存将一直存在,直到使用delete运算符将其释放或程序结束为止。这种内存的存储持续性为动态,有时候也被称为自由存储或堆。
1. 自动变量和栈

自动变量的数目随函数的开始和结束而增减,因此程序必须在运行时对自动变量进行管理,常用的方法是留出一段内存,将其视为栈,以管理动态变量的增减。

2.静态持续变量
  • 静态持续变量简介

和c语言一样,c++也为静态持续变量提供了3种链接性,外部链接性(可在其他文件中访问),内部链接性(只能在当前文件中访问),无链接性(只能在函数内部和代码块中访问)。编译器将分配固定的内存块来存储所有的静态持续变量,这些变量在程序运行期间将一直存在。另外,如果没有显示的初始化静态变量,编译器将把它们设置为0。

下面是创建3种静态持续变量的方式:

...
int global =1001;       //静态持续变量:外部链接性
static int one_file =50;//静态持续变量:内部链接性
int main()
{
    ...
}
void f1(int n)
{
    static int count=0;//静态持续变量:无链接性
    int i=1;
    ...
}
void f2(float m )
{
    ...
}
  • 静态持续变量的初始化

静态持续变量的初始化过程:首先,所有的静态变量都将被零初始化,而不管程序员是否显示地初始化了它。接下来,如果使用常量表达式初始化了变量,且编译器仅根据文件内容(包括被包含的头文件)就可计算表达式,编译器将执行常量表达式初始化。必要时,编译器将执行简单计算。如果没有足够的信息,变量将被动态初始化。

### Thymeleaf 变量作用域详解 在Thymeleaf中,变量可以在不同的上下文中定义并具有不同范围的作用域。理解这些作用域能够帮助开发者更好地管理数据流以及提高模板渲染效率。 #### 局部作用域 (Local Scope) 局部变量仅限于当前标签及其子标签内有效。一旦超出这个区域,则无法访问该变量。可以通过`th:with`属来创建这样的临时实体[^1]: ```html <div th:with="localVar='This is a local variable'"> <span th:text="${localVar}"></span> </div> <!-- localVar cannot be accessed here --> ``` #### 请求作用域 (Request Scope) 当通过控制器传递给视图层的对象,默认情况下会处于请求范围内。这意味着在整个HTTP请求周期里都可以获取到它们的信息,在多个页面间共享也是可行的,只要是在同一次请求过程中[^2]。 例如在一个Spring MVC应用中设置模型属: ```java @GetMapping("/example") public String example(Model model){ model.addAttribute("requestScopedVariable", "Value from controller"); return "viewName"; } ``` 对应的HTML文件可以这样使用它: ```html <p th:text="'The value of request scoped var is ' + ${requestScopedVariable}" /> ``` #### 会话作用域 (Session Scope) 某些时候可能希望保存用户特定的数据直到浏览器关闭为止,这时就可以利用session对象来进行存储操作。任何存入其中的东西都会持续存在于用户的整个浏览期间,并且只对该用户可见[^3]。 向会话添加新项的方式如下所示(Java代码片段): ```java @GetMapping("/set-session-var") public String setSessionVar(HttpSession session){ session.setAttribute("sessionVar","A value stored in the HttpSession object."); return "redirect:/show-session-var"; } ``` 而在前端展示这部分内容时只需像下面这样做即可: ```html <p th:text="'Your session variable contains this message:' + ${session['sessionVar']}" /> ``` #### 应用程序作用域 (Application Scope) 最后一种类型的应用级作用域意味着其内的条目可供所有来访者共同读取;换句话说就是全局的配置参数或者是静态资源链接地址等信息适合放置于此处[^4]。 为了把东西放进application scope里面,通常会在启动类或者配置类上做文章,比如采用`@Component`注解配合`ServletContext`接口完成这项工作: ```java @Component public class ApplicationScopeConfig implements ServletContextAware { @Override public void setServletContext(ServletContext servletContext) { servletContext.setAttribute("appWideSetting", "Global setting available to all users"); } } // 或者直接注入ServletContext并在适当的地方调用setAttribute方法 @Autowired private ServletContext context; ... context.setAttribute("anotherAppWideSetting", someObject); ``` 之后便能在任意地方轻松引用此设定啦! ```html <span th:text="'An application-wide property says: ' + ${#ctx.applicationMap.appWideSetting}" /> ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值