不管什么时候运行一个程序,都是首先把它装入(一般从磁盘装入)计算机内存。因此程序中的所有元素都驻留在内存的某处。内存一般被布置成一系列连续的内存位置;我们通常把这些位置看做是8位的字节,但实际上每一个空间的大小取决于具体机器的结构,一般称为机器的字长(word size)。每一个空间可按它的地址与其他空间区分。
静态与动态内存分配的两个主要区别是:
1.静态对象是有名字的变量,我们直接对其进行操作。而动态对象是没有名字的变量,我们通过指针间接地对它进行操作。
2.静态对象的分配与释放由编译器自动处理。程序员需要理解这一点,但不需要做任何事情。相反,动态对象的分配与释放,必须由程序员显式地管理。相对来说比较容易出错,它通过new和delete两个表达式来完成。
“类的公共接口与私有实现的分离“被称为信息隐藏(information hiding)。
简单说来,它为程序提供了两个主要好处:
1.如果类的私有实现需要修改或扩展,那么只有相对很小一部分”要求访问这些实现的成员函数“才需要修改。许多使用该类的用户程序一般无需修改,但是要求重新编译。
2.如果类的私有实现有错误,那么通常需检查的代码数量只局限在相对较少的需要访问这些实现的成员函数上,而无需检查整个程序。
返回值优化
通过传值方式返回要创建新对象时,应注意使用的形式。
return Integer(left.i + right.i);
咋看起来这像是一个”对一个构造函数的调用“,其实并非如此。这是临时对象语法,它只在说:“创建一个临时Integer对象并返回它”。据此我们可能认为如果创建一个有名字的局部对象并返回它结果将会是一样的。其实不然。如果如下编写:
Integer tmp(left.i + right.i);
return tmp;
将发生三件事。首先,创建tmp对象,其中包括构造函数的调用,然后,烤贝构造函数把tmp烤贝到外部返回值的存储单元里。最后,当tmp在作用域的结尾时调用析构函数。
相反,“返回临时对象”的方式是完全不同的。当编译器看到我们这样做时,它明白对创建的对象没有其他需求,只是返回它,所以编译器直接地把这个对象创建在外部返回值内存单元。因为不是真正创建一个局部对象,所以仅需要一个不同构造函数调用(不需要拷贝构造函数),且不会调用析构函数。这种方法不需要什么花费,因此效率是非常高的,但程序员要理解这些。这种方式常被称作返回值优化(return value optimization)。
不能重载的运算符
在可用的运算符集合里存在一些不能重载的运算符。这样限制的通常原因是出于对安全的考虑:如果这些运算符也可以被重载,将会造成危害或破坏安全机制,使得事情变得更苦难或混淆现有的习惯。
1.成员选择operator.。点在类中对任何成员都有一定的意义。但如果允许它重载,就不能用普通的方法访问成员,只能用指针和指针operator->访问。
2.成员指针间接引用operator.*,因为与operator.同样的原因而不能重载。
3.没有求幂运算符。通常的选择是来自Fotran语言的operator**,但这出现了难以分析的问题。C没有求幂运算符,c++似乎也不需要,因为这可以通过函数调用来实现。求幂运算符增加了使用的方便,但没有增加新的语言功能,反而为编译器增加了复杂性。
4.不存在用户定义的运算符,即不能编写目前运算符集合中没有的运算符。不能这样做的部分原因是难以决定其优先级,另一部分原因是没有必要增加麻烦。
5.不能改变优先级规则,否则人们很难记住它们。
分享到:
相关推荐
为了解决这个问题,文档提出了一种结合C/C++与Python优势的方案。具体来说,C/C++语言被用来编写与RPLIDAR进行通讯和数据解析的模块,因为这一部分的工作量大、计算密集且对实时性要求高。而Python则被用来编写数据...
在C++编程中,内存管理是一项至关重要的技能,它直接影响程序的性能、稳定性和资源利用率。C++不同于许多高级语言,如Java或Python,它不提供自动垃圾回收机制,因此程序员需要手动进行内存分配和释放。本文将深入...
C++内存流CMemoryStream是MFC(Microsoft Foundation Classes)库中的一个重要组件,它允许程序在内存中读写数据,从而实现类似与文件流的操作。内存流提供了一种高效、灵活的方式来处理内存中的数据,特别是在处理...
C++内存管理是编程领域中的一个关键话题,尤其...与其他如Java或.NET平台相比,C++的内存管理虽然需要更多手动工作,但也提供了更多底层控制的可能性。对于追求性能和低级优化的开发者来说,这是一个无法忽视的领域。
在C++编程中,内存管理是一项关键任务...总之,C++内存快照的实现是通过监控内存分配和释放,结合dump文件的生成与分析,来辅助调试和诊断内存相关问题的过程。熟练掌握这一技术,可以极大地提高软件开发和维护的效率。
《C++高效编程:内存与性能优化》是一本专注于C++编程语言内存管理和性能调优的书籍。本书深入探讨了如何在C++编程中高效地使用内存资源,以及如何进行性能优化,以编写出既高效又优雅的代码。 书籍作者Rene ...
"内存映射 C++ 实例" 内存映射是指将硬盘上的文件映射到内存中,以便更快速地访问和操作文件。这种技术可以解决大文件读写时的内存资源不足问题。下面是关于内存映射的知识点: 1. 内存映射的定义:内存映射是操作...
在C++中,Windows API提供了CreateFileMapping和MapViewOfFile函数来创建和映射文件映射对象,从而实现共享内存。首先,我们需要使用CreateFileMapping函数创建一个文件映射对象,该对象可以理解为一个内存区域的...
下面我们将详细探讨内存虚拟硬盘的原理、实现方式以及C++源码在其中的角色。 内存虚拟硬盘的基本原理是将一部分物理内存划分为一个或多个逻辑驱动器,这些驱动器就像传统的硬盘一样可以被操作系统识别并进行读写...
总的来说,通过共享内存,我们可以实现C和C++程序与Codesys软PLC之间的高效通信,实现设备控制、数据交换等复杂任务,这对于工业自动化、物联网等领域的应用具有重要意义。在实际开发中,需要注意线程安全、数据同步...
C++ 对象内存模型 C++ 对象内存模型是 C++ 编程语言中一个重要的概念, 它描述了 C++ 对象在内存中的存储结构。这个模型是 C++ 编程语言的基础之一,对于理解 C++ 编程语言的工作机理具有重要的意义。 在 C++ 中,...
"C++内存管理" ..."C++内存管理"资源摘要信息是C++内存管理的核心要素,它涵盖了内存管理的重要性、内存分配方式、内存泄漏和内存回收等方面的知识点,为读者提供了一个系统的C++内存管理知识框架。
在C++编程中,内存管理是一项关键任务,而内存泄漏是开发者经常遇到的挑战。内存泄漏指的是程序在分配了内存后未能正确释放,导致这部分内存无法再被程序使用,随着时间推移,大量的内存泄漏可能会耗尽系统资源,...
在编程领域,尤其是在C/C++中,动态内存分配与回收是一项关键技能,它涉及到程序运行时内存的管理和优化。动态内存分配允许程序在运行时根据需要请求和释放内存,而不是在编译时就预设固定的内存空间。这使得程序...
以下是一些关于C++内存与性能优化的重要知识点: 1. **内存管理**: - **栈内存**:C++中的局部变量默认存储在栈上,分配和释放快速,但空间有限,适用于生命周期短、大小固定的对象。 - **堆内存**:通过`new`...
5. **RAII(Resource Acquisition Is Initialization)**:C++提倡的一种内存管理策略,通过对象的生命周期管理内存,当对象创建时分配内存,对象销毁时自动释放,有效防止内存泄漏。 6. **智能指针**:如`std::...
"C++类继承内存布局详解图" C++类继承内存布局是一种复杂的机制,涉及到类的继承、成员变量的访问、成员函数的访问、虚函数调用、强制转换到基类或虚基类等多个方面。在本文中,我们将从C结构的布局开始,逐步介绍...
在C++11中,我们可以利用其新引入的特性来实现一个简单的内存池。本项目就是针对这一主题的一个实践,适用于Visual Studio 2015、g++4.8和clang++3.4等编译器。 内存池的基本思想是避免频繁的系统调用,因为传统的...
闲来无事,考虑到以前遇到的一个问题,使用std::vector进行数据的存储,如果存储的数据量多大或者是没有足够的内存时该何如处理,联想到学习OS时虚拟内存的概念,感觉是一个好的解决方法,于是动手写了一个小的程序...
在C++编程中,内存池的实现通常涉及对内存管理的深入理解以及对多线程环境下的并发控制。 本项目提供了一个C++内存池的实现,包括全局的一级内存池和每个线程独立的二级内存池。这种设计考虑到了多线程环境下的内存...