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

在C++中缓存昂贵的数据 - 函数范围的静态与可变成员变量

在C++中,缓存昂贵的数据可以通过函数范围的静态变量和可变成员变量来实现。以下是这两种方法的详细介绍:

  1. 函数范围的静态变量

函数范围的静态变量是在函数内部定义的静态变量,其生命周期与程序的生命周期相同,且在整个程序中只有一个实例。这意味着,当你第一次调用该函数时,静态变量将被初始化,并在程序的整个生命周期内保留其值。使用函数范围的静态变量可以有效地缓存昂贵的数据,以便在多次函数调用中重用。

例如:

代码语言:cpp
复制
int expensiveFunction() {
    static int cachedValue = 0;
    if (cachedValue == 0) {
        // 昂贵的计算操作
        cachedValue = someExpensiveOperation();
    }
    return cachedValue;
}
  1. 可变成员变量

可变成员变量是在类的实例中定义的变量,其生命周期与类的实例的生命周期相同。与函数范围的静态变量不同,可变成员变量可以在类的多个方法中共享,并且可以根据需要进行更新。这使得它们成为缓存昂贵数据的理想选择。

例如:

代码语言:cpp
复制
class MyClass {
public:
    int getExpensiveData() {
        if (!m_isDataCached) {
            // 昂贵的计算操作
            m_cachedData = someExpensiveOperation();
            m_isDataCached = true;
        }
        return m_cachedData;
    }

private:
    int m_cachedData = 0;
    bool m_isDataCached = false;
};

总之,在C++中,缓存昂贵的数据可以通过函数范围的静态变量和可变成员变量来实现。这两种方法都可以有效地提高程序的性能,并减少昂贵数据的重复计算。

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

相关·内容

C++静态数据成员静态成员函数

,如果用全局变量来描述它们相同属性,就会破坏类独立性。...我们需要一个成员为所有对象所公有,而且需要更新这个公有属性时候只需修改一次。 因此,C++提供了静态数据成员来描述类对象相同属性。...类定义时候非静态数据成员是不分配内存,只有创建类对象时候才分配内存,但静态数据成员是要分配内存,因为它是属于类,只有一块内存,所以要初始化它,而且不能在类声明初始化,必须要在类外初始化...静态成员函数 一般都是静态成员函数修改静态数据成员刚刚手机类声明成员函数: static void change(); 就是静态成员函数。...但是非静态成员函数可以任意地访问静态成员函数静态数据成员。 那静态成员函数存在意义是什么?

15830

C++const成员变量成员函数

,如果你不希望某些数据被修改,可以使用const关键字加以限定。const 可以用来修饰成员变量成员函数。...初始化 const 成员变量只有一种方法,就是通过构造函数初始化列表,这点在前面已经讲到了,请猛击《C++初始化列表》回顾。...const成员函数(常成员函数) const 成员函数可以使用类所有成员变量,但是不能修改它们值,这种措施主要还是为了保护数据而设置。const 成员函数也称为常成员函数。...我们通常将 get 函数设置为常成员函数。读取成员变量函数名字通常以get开头,后跟成员变量名字,所以通常将它们称为 get 函数。...函数头部结尾加上 const 表示常成员函数,这种函数只能读取成员变量值,而不能修改成员变量值,例如char * getname() const。

21330

C++一分钟之-C++静态成员静态函数

C++编程静态成员静态函数是类设计重要概念,它们打破了常规成员“每个对象一份”规则,为类所有实例共享同一份数据或行为提供了途径。...共享配置:存储所有对象共用配置信息。 常见问题避免 初始化时机:静态成员变量首次使用或显式初始化时初始化,这可能导致初始化顺序问题。...访问静态成员:操作静态成员变量理想场所。 常见问题避免 误用this指针:静态成员函数不存在this指针,尝试使用会导致编译错误。...C++中提供了灵活类设计方式,允许实现类级别的共享数据和行为。...通过本文介绍和示例,希望你能准确把握静态成员静态函数精髓,避开常见陷阱,更加自信地C++项目中运用它们。

14510

C++】static关键字及其修饰静态成员变量函数详解

static引入 static 是 C/C++ 很常用修饰符,它被用来控制变量存储方式和可见性。... C++ static 内部实现机制:静态数据成员要在程序一开始运行时就必须存在。因为函数程序运行中被调用,所以静态数据成员不能在任何函数内分配空间和初始化。...静态数据成员要实际地分配空间,故不能在类声明定义(只能声明数据成员)。类声明只声明一个类"尺寸和规格",并不进行实际内存分配,所以类声明写成定义是错误。...static 被引入以告知编译器,将变量存储程序静态存储区而非栈上空间,静态数据成员按定义出现先后顺序依次初始化,注意静态成员嵌套时,要保证所嵌套成员已经初始化了。...静态成员变量和类对象和其成员变量关系如下图: 静态成员变量必须在类外定义,定义时不添加static关键字,类只是声明 类静态成员即可用 类名::静态成员 或者 对象.静态成员 来访问 静态成员函数没有隐藏

1.2K10

C++static成员函数以及static成员变量详解「建议收藏」

static成员变量,在编程我们时常都会遇到,那么你是否对static变量以及static成员函数有一定深入认识呢?...static定义成员变量,存储区域是内存四区(栈区、堆区、全局区、代码区)全局区,程序运行之前就已经生成全局区,直到程序运行结束才会被系统释放。...C++中有时会定义一些static变量,同时也会定义一些static成员函数。...); 2.static成员变量(属性)并不占用类内存空间,static成员变量并不存储,存储全局区; 3.static成员变量(属性)时所有对象共同拥有的一份变量,并不属于任何一个对象成员;...4.static成员属性以及static成员函数都不存在this指针(并不属于任何一个成员); 5.static成员属性能够被继承,可以派生类访问到(前提:原有属性为公有,继承为公有继承),但是存储只是一份数据

81030

C++继承同名成员处理方式同名静态成员处理方式

继承同名成员处理方式 问题:当子类父类出现同名成员,如何通过子类对象,访问到子类或父类同名数据呢?...- func()调用" << endl; } }; class Son : public Base { public: //当子类父类拥有同名成员函数,子类会隐藏父类中所有版本同名成员函数...s.func(); s.Base::func(); } int main() { test01(); system("pause"); return EXIT_SUCCESS; } 是否可以通过函数重载来区分父类和子类成员函数...{ cout << "Base - func(int a)调用" << endl; } }; class Son : public Base { public: //当子类父类拥有同名成员函数...子类对象加作用域可以访问到父类同名成员 当子类父类拥有同名成员函数,子类会隐藏父类中所有的同名成员函数,加作用域可以访问到父类同名函数 继承同名静态成员处理方式 问题:继承同名静态成员子类对象上如何进行访问

48330

C++】构造函数初始化列表 ③ ( 构造函数 初始化列表 为 const 成员变量初始化 )

构造函数初始化列表 总结 : 初始化列表 可以 为 类 成员变量 提供初始值 ; 初始化列表 可以 调用 类 成员变量 类型 构造函数 进行成员变量初始化操作 ; 初始化列表 可以 使用 构造函数...传入 参数 ; 类初始化时 , 根据定义顺序 , 先调用 成员变量 构造函数 , 然后调用外部类构造函数 , 析构函数正好相反 ; 实例对象 const 成员变量 必须只能在 初始化列表 中进行...初始化 , 所有的构造函数都要进行初始化操作 ; 一、构造函数 初始化列表 为 const 成员变量初始化 1、初始化 const 常量成员 如果 类 定义了 被 const 修饰 成员变量...: 这里区分 初始化 赋值 , 初始化 是 变量 声明时 同时 为其 设置一个 初始化值 ; 赋值 是 变量 声明以后 , 再对变量进行赋值 ; const 成员变量 是常量 , 是 无法声明后..., 对 常量成员 进行初始化操作 ; 3、正确代码示例 - 初始化列表初始化常量成员 在下面的 类 B , 所有的 构造函数 , 都要使用 初始化列表 初始化 常量成员 , 只要遗漏一个构造函数

18630

C++C++ this 指针用法 ③ ( 全局函数 成员函数 相互转化 | 有参构造函数设置默认参数值 | 返回匿名对象返回引用 )

一、全局函数 成员函数 相互转化 1、成员函数转为全局函数 - 多了一个参数 C++ 编译器 , 在编译阶段会将 C++ 成员函数 转为 全局函数 , 转换时 , 会 增加一个参数到参数列表开始为止..., 这个增加参数是 对象本身指针 ; Student 类 , 定义了如下函数 : // 成员函数 转为 全局函数 , 多了一个参数 Student* pThis 作为第一个参数 void...Student* pThis 列表开始位置 ; 详细代码 , 参考最后完整代码示例 ; 2、全局函数转为成员函数 - 通过 this 指针隐藏操作数 全局函数转为成员函数 , 需要隐藏一个参数..., 就是通过 this 指针隐藏左操作数 , 对象本身 就是 左操作数 , 成员函数 , 通过 this 指针访问对象本身成员 ; 全局函数 , 实现两个 Student 类相加 , 接收两个...返回是一个匿名对象 , 该匿名对象 是 成员函数 中新创建对象 ; // 成员函数, 将两个 Student 对象相加 // 全局函数 转为 成员函数 , 少了一个参数 // 返回一个新

18120

CC++面试题之语言基础篇(二)

准备C/C++面试需要深入研究语言基础知识,掌握控制流结构、函数、指针和标准库,同时准备好回答各种C/C++编程相关问题,这将有助于你面试脱颖而出。...return 0; } 静态成员变量静态成员函数 静态成员变量静态成员变量必须在类内声明,类外初始化。...静态成员函数静态成员函数只能访问静态成员变量静态成员函数,不可以访问类静态成员变量或非静态成员函数,而非静态成员函数都可以访问。...静态链接库动态链接库区别 静态链接库和动态链接库是两种不同库文件,用于软件开发管理和重用代码。...它们有以下主要区别: 链接方式:静态链接库在编译时将代码和数据可执行程序一起链接,形成一个独立可执行文件。而动态链接库代码和数据保留在单独库文件

15210

Java 基础 - 知识点

,就是先判断值是否缓存池中,如果在的话就直接返回缓存内容。...成员可见表示其它类可以用这个类实例对象访问到该成员; protected 用于修饰成员,表示继承体系成员对于子类可见,但是这个访问修饰符对于类没有意义。...静态变量 静态变量: 又称为类变量,也就是说这个变量属于类,类所有的实例都共享静态变量,可以直接通过类名来访问它;静态变量在内存只存在一份。...初始化顺序 静态变量静态语句块优先于实例变量和普通语句块,静态变量静态语句块初始化顺序取决于它们代码顺序。...、静态语句块) 父类(实例变量、普通语句块) 父类(构造函数) 子类(实例变量、普通语句块) 子类(构造函数) # 反射 每个类都有一个 Class 对象,包含了类有关信息。

59150

C++基础 杂记(一)

最容易想到方法是定义为全局变量,但会破坏此变量访问范围(使得在此函数定义变量,不仅仅只受此函数控制)。static 关键字则可以很好解决这个问题。...,因而其它文件可以定义相同名字变量,不会发生冲突 static 修饰函数只能在本文件调用,不能被其他文件调用 static 修饰变量存放在**全局数据静态变量区**,包括全局静态变量和局部静态变量...静态成员**可以**通过双冒号来使用::,非静态成员引用**必须**特定对象相对对象.成员名 类静态成员函数**不能**使用类静态成员(因为**静态成员函数属于整个类,类实例化对象之前就已经分配空间了...**,而非静态成员类实例化对象后才有内存空间,因而静态成员不认识后来静态成员) 类静态成员函数可以调用用静态成员函数,但反之不能 静态成员函数没有 this 指针(因其属于整个类) 类静态成员变量必须先初始化再使用.../details/6721430 C++指针和引用区别 指针是一个变量,该变量存储是一个地址,指向内存一个存储单元 引用原来变量实质上是同一个东西,只不过是原变量一个别名而已 指针可以为空

37510

Java 基础知识:面试官必问问题

,就是先判断值是否缓存池中,如果在的话就直接返回缓存内容。...be interned (JLS7 5.1.7) assert IntegerCache.high >= 127; } 编译器会在自动装箱过程调用 valueOf() 方法,因此多个值相同且值缓存范围...static 静态变量 静态变量:又称为类变量,也就是说这个变量属于类,类所有的实例都共享静态变量,可以直接通过类名来访问它。静态变量在内存只存在一份。....* 初始化顺序 静态变量静态语句块优先于实例变量和普通语句块,静态变量静态语句块初始化顺序取决于它们代码顺序。...public InitialOrderTest() { System.out.println("构造函数"); } 存在继承情况下,初始化顺序为: 父类(静态变量静态语句块) 子类(静态变量

43870

20道必须掌握C++面试题

答: 1.const 修饰类成员变量,表示成员常量,不能被修改。 2.const修饰函数承诺函数内部不会修改类内数据成员,不会调用其它非 const 成员函数。...函数static变量什么时候初始化? 答:类静态成员变量类实例化之前就已经存在了,并且分配了内存。函数static变量执行此函数时进行初始化。 问10:堆和栈区别?...实际处理这个调用部件是调用发出后,通过状态、通知来通知调用者,或通过回调函数处理这个调用。 问19:解释C++静态函数静态变量?...答: (1)类静态数据成员在编译时创建并初始化:该类任何对象建立之前就存在,不属于任何对象,而非静态成员变量则是属于对象所有的。类静态数据成员只有一个拷贝,为所有此类对象所共享。...函数定义变量通常是栈上,用malloc, calloc, realloc等分配内存函数分配得到就是堆上。

54120

记一次阿里实习生电面经历

答:“栈” 问:“函数局部静态变量保存在哪里?” 答:“静态区。。” 问:“局部静态变量和全局静态变量有不同吗,不同点在哪里?”...答:“没太大不同,都存在一起……” 问:“不是问存储位置,其他方面呢?” 答:“哦,可视范围不同。全局静态变量全局可见,局部静态变量只有函数内部可见。”...问:“全局变量和全局静态变量有何不同” 答:“存位置是挨着,要说不同的话,也是可视范围吧,全局静态变量仅在当前文件内可见,全局变量是该项目所有文件可见。” 3....以前时候Linux编程(POSIX)IP地址结构体(struct in_addr)就是一个联合(也可能是结构体成员是联合),比如成员是4个元素char数组,两个元素short数组,或一个int...记得安卓里面见到过。就扯了一下安卓。。 问:“那么C++该如何实现呢” 接下来,确实也是运气。脑袋里冒出个函数指针,就脱口而出了,说了个一般函数指针用法。貌似说对了。

42810

C++】C++11 新特性

一、C++ 发展史 1982年,Bjarne Stroustrup 博士C语言基础上引入并扩充了面向对象概念,发明了一种新程序语言。为了表达该语言C语言渊源关系,所以将其命名为C++。...---- 十一、可变参数模板 1、可变参数模板语法 C语言中我们使用 … 来表示可变参数,比如 printf 和 scanf 函数C++ 沿用了这个用法: 可变参数模板形式 但 C++...endl; return 0; } 需要特别注意是:当 function 封装是类成员函数时,我们需要对该成员函数进行类域声明,并且还需要在类域前面加一个取地址符,另外,成员函数又分为静态成员函数和非静态成员函数...: 静态成员函数没有 this 指针,所以 function 类实例化时不需要添加一个成员函数所属类类型参数,调用时也不需要传递一个成员函数所属类对象; 但非静态成员函数有隐藏 this 指针...,并且也不需要我们 function 参数包显式声明;这样我们就可以通过绑定让我们将类普通成员函数和类静态成员函数以及 lambda 表达式、函数指针一样定义为统一类型了;如下: 需要说明

1.3K10

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

C++创建变量时,前面有时会有一些修饰符,这里总结一下。 大体分为两个类别:存储说明符和cv-限定符。...register修饰变量将创建一个寄存器变量,理念在于CPU访问寄存器值比访问普通存储堆栈值速度要快,声明方法: register int count_fast; 需要注意是,编译器并不一定会满足将变量放在寄存器要求...要注意静态变量使用范围: int global = 1000;// 函数外声明,文件内外皆可使用 // 此时如果其他文件还想创建global同名变量,要么用extern声明(此时用还是同一个,共享了变量...int lama = 0;// 普通变量,只能在函数内使用,函数不执行就不会存在 } 函数内创建外部静态变量同名变量时,将使用自己创建,但是可以用::操作符表示使用外部: int global...因为假设编译器发现程序几条语句中都使用了某个变量,那么为了优化,它不会让程序去查多次,而是缓存到寄存器

58910

Java 基础常见知识点&面试题总结(上),2022 最新版!

而非静态成员属于实例对象,只有在对象实例化之后才存在,需要通过类实例对象去访问。 静态成员不存在时候静态成员就已经存在了,此时调用在内存还不存在静态成员,属于非法操作。...Person.staicMethod() } } 2、访问类成员是否存在限制 静态方法访问本类成员时,只允许访问静态成员(即静态成员变量静态方法),不允许访问实例成员(...基本数据类型局部变量存放在 Java 虚拟机栈局部变量,基本数据类型成员变量(未被 static 修饰 )存放在 Java 虚拟机。...基本数据类型成员变量如果没有被 static 修饰的话(不建议这么使用,应该要使用基本数据类型对应包装类型),就存放在堆。...Byte,Short,Integer,Long 这 4 种包装类默认创建了数值 [-128,127] 相应类型缓存数据,Character 创建了数值 [0,127] 范围缓存数据,Boolean

35920

C++最佳实践 | 5. 可移植性及多线程

多线程 避免全局数据 全局数据会导致函数之间意想不到副作用,并可能使代码难以甚至无法并行化。即使现在代码不是为了并行化而写,也没有理由将来永远不做并行化。...静态(static)数据 除了作为全局数据之外,静态数据并不总是像期望那样被构造和析构,跨平台环境尤其如此。例如,有个g++bug[2]就是关于从动态模块加载共享静态数据销毁顺序。...单例(Singleton) 单例通常使用静态和/或shared_ptr实现。 避免堆操作 堆操作多线程环境要慢得多,许多甚至大多数情况下,复制数据会更快,更别提还有move操作这之类东西。...互斥对象(mutex)和可变对象(mutable)一起使用(M&M规则,C++11) 对于成员变量,最好同时使用互斥锁和可变变量,这在两方面都适用: 可变成员变量被假定为共享变量,因此应该互斥锁同步(...如果一个成员变量本身是互斥,那么应该是可变,这是const成员函数中使用它所必需

52920

【BATJ面试必会】Java 基础篇(一)

-- GFM-TOC --> 一、数据类型 包装类型 缓存池 二、String 概览 不可变好处 String, StringBuffer and StringBuilder String Pool... Java 8 ,String 内部使用 char 数组存储数据。...静态变量 静态变量:又称为类变量,也就是说这个变量属于类,类所有的实例都共享静态变量,可以直接通过类名来访问它。静态变量在内存只存在一份。...初始化顺序 静态变量静态语句块优先于实例变量和普通语句块,静态变量静态语句块初始化顺序取决于它们代码顺序。...、静态语句块) 父类(实例变量、普通语句块) 父类(构造函数) 子类(实例变量、普通语句块) 子类(构造函数) 七、反射 每个类都有一个 Class 对象,包含了类有关信息。

45520
领券