C/C++编译器全局优化技术:全局优化是针对整个程序进行的优化,包括函数之间的优化

简介: C/C++编译器全局优化技术:全局优化是针对整个程序进行的优化,包括函数之间的优化

引言

编程语言的设计和实现与人类心理学有着密切的联系。C++编译器全局优化技术在这个领域中是一个重要的例子。在这篇博客中,我们将从心理学的角度来探讨C++编译器全局优化技术的原理和实践。

人类大脑的神经网络在处理信息时,会自动进行优化以提高效率。我们的思维和学习过程中,大脑会对输入的信息进行筛选、整合和归纳,这样可以帮助我们在复杂环境中迅速做出判断和决策。同样地,C++编译器全局优化技术也是为了在程序运行时更高效地处理信息而设计的。

全局优化技术的核心目标是使生成的目标代码在执行速度、资源占用和能耗方面达到最佳表现。这一点与心理学中的“认知经济原则”(Cognitive Economy Principle)相呼应,这一原则表明,人们在面对复杂任务时,会自动寻找最节省认知资源的方法。C++编译器全局优化技术也恰恰遵循了这一原则,致力于在不牺牲程序正确性的前提下,提高程序的整体性能。

学习全局优化技术不仅能够帮助程序员编写出更高效的代码,还有助于我们更深入地理解人类心理学中的优化机制。在接下来的内容中,我们将详细探讨C++编译器全局优化技术的基本原理、技术方法和实际应用案例。希望通过本篇博客的学习,您能够发现编程与心理学之间的奇妙联系,并从中受益。

函数内联:将小函数的实现替换到调用位置,以减少函数调用开销。

内联(Inlining)是一种编译器优化技术,其目的是减少函数调用的开销。通过将函数体直接嵌入到调用它的地方,内联技术可以避免函数调用过程中的一些额外开销,例如参数传递、寄存器保存和恢复、栈帧分配等。这样可以提高程序执行速度,尤其在频繁调用的小型函数中表现得尤为明显。

内联的实现

在 C++ 中,可以使用 inline 关键字来建议编译器对某个函数进行内联优化。然而,inline 关键字仅仅是一个建议,编译器可以自行决定是否进行内联。编译器可能会基于函数的复杂性、调用频率等因素来决定是否执行内联。例如,对于较大的函数,编译器可能会选择不进行内联,因为内联可能会导致代码膨胀,反而降低性能。

inline int add(int a, int b) {
    return a + b;
}
int main() {
    int result = add(3, 5);
    return 0;
}

在这个例子中,编译器可能会选择将 add 函数内联到 main 函数中,从而避免函数调用开销。内联后的 main 函数可能类似于这样:

int main() {
    int result = 3 + 5;
    return 0;
}

内联的优缺点

优点:

  1. 减少函数调用的开销,提高程序执行速度。
  2. 在某些情况下,内联可能使得编译器能够执行其他优化,例如常量折叠。

缺点:

  1. 内联可能导致代码膨胀,因为函数体会被嵌入到每个调用它的地方。这可能会增加二进制文件大小,甚至影响 CPU 缓存效率。
  2. 过度内联可能使得程序变得难以维护,因为修改内联函数的源代码会导致需要重新编译所有调用它的地方。

内联建议

  1. 对于小型和简单的函数,使用内联是有益的。但对于复杂或者大型函数,内联可能导致代码膨胀,反而降低性能。
  2. 使用 inline 关键字来建议编译器进行内联优化,但要意识到编译器不一定会遵循这些建议。
  3. 关注编译器的优化选项。许多编译器允许调整内联程度,或者在特定情况下禁用内联。
  4. 如果可以,利用 C++11 或更高版本的特性,例如 constexpr 函数,

全局常量传播:在整个程序范围内传播已知的常量值。

全局常量传播(Global Constant Propagation)是一种编译器优化技术,用于在整个程序范围内传播已知的常量值。这种优化技术有助于提高程序执行速度,减少运行时计算的需求,并可能触发其他优化,例如死代码消除。

全局常量传播在编译期进行,编译器分析整个程序,确定常量值在哪里被使用,并在可能的情况下,将常量值直接替换为已知的值。这样做可以减少计算量和内存访问次数,从而提高程序执行速度。

全局常量传播的主要思想是在编译阶段通过数据流分析确定程序中的常量值,并将这些常量值直接替换到使用它们的表达式中。这样可以在运行时消除不必要的计算和存储开销。考虑以下示例:

def square(x):
    return x * x
def main():
    y = 4
    z = square(y)
    print(z)

在这个例子中,变量 ymain 函数中被赋值为常量 4。编译器可以通过全局常量传播分析得出,square 函数的参数 x 在这种情况下也是常量 4。因此,编译器可以直接计算出 square(4) 的结果为 16,并将 z 直接替换为常量 16:

def main():
    y = 4
    z = 16
    print(z)

这种优化减少了运行时计算的开销,提高了程序性能。全局常量传播还可能与其他优化技术(如死代码消除、函数内联等)结合使用,进一步提高程序性能。

需要注意的是,全局常量传播可能会受到程序中的控制流、数据依赖和别名等因素的影响。在实际应用中,编译器需要使用一定的策略和算法(如迭代数据流分析算法、静态单赋值(SSA)形式等)来实现全局常量传播。

其他例子

假设我们有以下程序:

const int a = 3;
const int b = 5;
int foo(int x) {
    return x * a;
}
int main() {
    int c = foo(b);
    return c;
}

在这个例子中,ab 是已知的常量值。编译器可以在编译期通过全局常量传播优化,将 ab 的值传播到整个程序范围内。优化后的代码可能如下:

int foo(int x) {
    return x * 3;
}
int main() {
    int c = foo(5);
    return c;
}

通过全局常量传播优化,ab 的值已经在编译期被传播。这使得编译器能够进一步执行其他优化,例如内联、常量折叠和死代码消除。最终优化后的代码可能类似于:

int main() {
    int c = 15;
    return c;
}

注意事项

  1. 全局常量传播可能会导致编译过程变慢,因为编译器需要分析整个程序。在实际项目中,权衡编译时间与运行时性能之间的平衡是非常重要的。
  2. 全局常量传播与局部常量传播的主要区别在于范围。全局常量传播在整个程序范围内进行优化,而局部常量传播仅关注单个函数或代码块内的优化。
  3. 在某些情况下,全局常量传播可能导致程序的逻辑错误,特别是当程序依赖于非常量值的时候。在这种情况下,应仔细审查程序逻辑,确保编译器优化不会导致不正确的行为。

全局无用代码消除:在整个程序范围内消除无用代码。

全局无用代码消除(Global Dead Code Elimination)是一种编译器优化技术,旨在在整个程序范围内识别和删除无用代码。无用代码是指那些在程序执行过程中不会被使用或者对最终结果没有影响的代码。消除无用代码可以减小二进制文件的大小、降低程序运行时的内存占用、减少不必要的计算,从而提高程序执行速度。

全局无用代码消除通过在编译阶段分析整个程序来实现,确定哪些代码是无用的。编译器会识别那些未使用的变量、未调用的函数、无效的条件分支等,然后在生成目标代码时删除这些部分。

例子

假设我们有以下程序:

int unusedFunction(int x) {
    return x * 2;
}
int usedFunction(int x) {
    return x + 3;
}
int main() {
    int a = 5;
    int b = usedFunction(a);
    return b;
}

在这个例子中,unusedFunction 函数未被调用。通过全局无用代码消除,编译器可以在目标代码中删除 unusedFunction。优化后的代码可能如下:

int usedFunction(int x) {
    return x + 3;
}
int main() {
    int a = 5;
    int b = usedFunction(a);
    return b;
}

注意事项

  1. 全局无用代码消除可能会导致编译过程变慢,因为编译器需要分析整个程序。在实际项目中,权衡编译时间与运行时性能之间的平衡是非常重要的。
  2. 虽然全局无用代码消除可以显著提高程序性能,但在某些情况下,可能会导致不正确的行为。例如,当某个未使用的函数在运行时有副作用(如修改全局变量)时,删除这个函数可能导致程序逻辑错误。在这种情况下,程序员需要仔细检查程序逻辑,以确保编译器优化不会导致不正确的行为。
  3. 针对某些特定平台或环境的优化可能会限制全局无用代码消除的范围。在这种情况下,可能需要结合其他优化方法以实现最佳性能。

全局变量优化:优化全局变量的访问和存储,减少内存占用。

全局变量优化是一种针对全局变量的编译器优化技术,旨在优化全局变量的访问和存储,从而减少内存占用和提高程序性能。全局变量在整个程序范围内都可访问,它们的优化需要考虑跨函数和模块的分析。全局变量优化主要包括以下策略:

  1. 全局变量消除:通过分析程序的数据流和控制流,确定全局变量的使用情况。如果发现某个全局变量没有被使用或只在局部范围内使用,可以将其消除或转换为局部变量。这样可以减少内存占用和全局变量的访问开销。
  2. 全局变量共享:在某些情况下,多个全局变量可能具有相同的值。编译器可以识别这种情况并合并这些变量,使它们共享相同的存储空间。这样可以减少内存占用,提高缓存局部性。
  3. 只读全局变量:如果发现某个全局变量在程序中从未被修改(即只读),编译器可以将其优化为只读变量(如常量)。这种优化可以减少运行时的内存写入操作,并为其他优化技术(如常量传播)创造条件。
  4. 全局变量到寄存器分配:对于访问频繁的全局变量,编译器可以尝试将其值分配到处理器的寄存器中。这样可以减少内存访问的开销,提高程序性能。
  5. 懒加载全局变量:如果某个全局变量的初始化涉及到大量计算或资源开销,编译器可以将其改为懒加载(Lazy Loading)模式。也就是说,只有在实际需要使用该变量时才进行初始化。这种优化可以减少程序启动时的开销,提高响应速度。

需要注意的是,在实际应用中,全局变量优化可能涉及到多种因素,如程序的控制流、数据依赖、编译器策略等。编译器需要综合考虑这些因素以确保优化的有效性和正确性。

总之,全局变量优化是一种重要的全局优化技术,可以帮助编译器减少内存占用和访问开销,提高程序性能。在编写代码时,程序员也应注意避免全局变量的滥用,尽量将变量的作用范围限制在最小必要范围,以提高代码的可读性和性能

代码移动:根据程序的控制流和数据流,移动指令以提高执行效率。

代码移动(Code Motion)是一种编译器优化技术,它根据程序的控制流和数据流分析,将指令从一个位置移动到另一个位置以提高执行效率。代码移动的主要目标是减少重复计算,减轻循环的负担,改善数据局部性,以及在可能的情况下并行执行。以下是一些常见的代码移动策略:

  1. 循环不变式外提:这种技术已经在之前的讨论中详细介绍过。它将循环内部不变的计算移动到循环外部,以减少重复计算。这种优化可以减轻循环负担,提高程序性能。
  2. 延迟代码:延迟代码是一种将计算推迟到实际需要结果的时候再执行的技术。这种优化可以避免不必要的计算,从而提高程序性能。例如,将一些计算从循环外部移到循环内部,只在需要这些计算结果时执行。
  3. 预提代码:预提代码是一种将计算提前到实际需要结果之前的技术。这种优化可以改善数据局部性,提高缓存命中率。例如,将一些计算从循环内部移到循环外部,以提前计算出结果。
  4. 指令调度:指令调度是一种根据处理器资源和数据依赖关系重新排列指令顺序的技术。这种优化可以提高处理器的并行执行能力,从而提高程序性能。指令调度可以在基本块内(局部指令调度)和跨基本块(全局指令调度)应用。
  5. 部分冗余消除:部分冗余消除是一种消除计算在程序的多个执行路径上的重复的技术。这种优化可以减少运行时的计算负担,提高程序性能。

在实际应用中,代码移动需要考虑程序的控制流、数据流、数据依赖和处理器资源等多种因素。编译器需要使用一定的策略和算法(如数据流分析、依赖分析等)来实现代码移动。需要注意的是,在进行代码移动时,必须确保优化不会影响程序的正确性。

总之,代码移动是一种重要的编译器优化技术,可以通过移动指令的位置来提高程序执行效率。程序员也应注意编写可读性高且易于优化的代码,从而充分利用编译器的优化能力。

  1. 全局数据流分析:这项技术分析程序中的数据流,以获取更多关于变量使用和定义的信息。这有助于编译器在全局范围内进行更精确的优化。
  2. 全局死代码消除:全局死代码消除是一种更进一步的优化技术,它可以在整个程序范围内找出并删除那些永远不会被执行的代码。
  3. 跨过程分析:这种技术分析多个函数之间的关系,以便在全局范围内进行优化。例如,编译器可能会识别出两个不同函数间的公共子表达式,并将其提取为一个单独的函数,从而减少代码重复。
  4. 指针别名分析:这种技术分析指针变量之间的关系,以便更准确地确定它们是否指向相同的内存地址。这有助于编译器进行更精确的优化,例如消除冗余的内存访问。
  5. 函数版本化:根据函数的调用上下文创建多个版本。例如,如果一个函数在某些情况下接收常量参数,在这些情况下可以生成一个特殊的函数版本,从而减少运行时的开销。
  6. 代码布局优化:调整程序的代码布局,使经常一起执行的代码片段靠近,从而减少指令缓存的失效率和提高程序执行速度。

全局数据流分析:这项技术分析程序中的数据流,以获取更多关于变量使用和定义的信息。这有助于编译器在全局范围内进行更精确的优化。

全局数据流分析是编译器优化中的一种重要技术。它分析整个程序的数据流,以收集有关变量使用和定义的信息。全局数据流分析的主要目的是识别全局范围内的数据依赖关系,从而为其他优化技术提供基础。以下是全局数据流分析的一些应用:

  1. 活跃变量分析:活跃变量分析可以识别在某个程序点上正在使用或将要使用的变量。这有助于编译器确定哪些变量在特定时间点是活跃的,从而有针对性地进行优化。
  2. 可用表达式分析:这种分析用于确定在程序的某个点之前计算的表达式是否仍然有效。如果一个表达式的结果可用,那么编译器可以避免重新计算它,从而提高程序执行效率。
  3. 常量传播:全局数据流分析可以帮助识别在整个程序范围内不会改变的变量。这些变量可以被视为常量,并在编译时进行传播,从而减少运行时的计算。
  4. 全局值编号:这种分析可以识别在程序中计算相同值的表达式。编译器可以通过消除这些冗余计算来提高程序执行效率。
  5. 指针别名分析:全局数据流分析可以帮助编译器识别指针变量之间的关系,从而准确地确定它们是否指向相同的内存地址。这有助于编译器进行更精确的优化,例如消除冗余的内存访问。

全局数据流分析通过在整个程序范围内分析数据流来实现更精确的优化。这些优化有助于提高程序的执行效率和性能。

全局死代码消除:全局死代码消除是一种更进一步的优化技术,它可以在整个程序范围内找出并删除那些永远不会被执行的代码。

全局死代码消除(Global Dead Code Elimination,GDCE)是编译器优化中的一种关键技术。其目标是在整个程序范围内识别并删除那些永远不会被执行的代码。这样做可以减少程序的大小和运行时的开销,从而提高程序的性能。

全局死代码消除的主要步骤如下:

  1. 识别死代码:首先,编译器需要找出那些永远不会被执行的代码。这可能包括不可达的基本块、永远不会被调用的函数或仅在特定条件下才会执行的代码。
  2. 删除死代码:编译器将识别到的死代码从程序中删除。这可能涉及到删除不可达的基本块、移除无用的函数或优化掉条件表达式中不会执行的分支。

全局死代码消除的一些应用场景包括:

  • 删除不可达的基本块:基本块是程序中的一个连续的指令序列,它们只有一个入口点和一个出口点。如果一个基本块永远不会被执行,那么编译器可以将其删除以减少程序的大小。
  • 移除无用的函数:如果一个函数从未被调用,那么它的存在对程序的执行没有任何影响。编译器可以安全地移除这样的函数,从而减小程序的大小。
  • 优化条件表达式:编译器可以通过全局数据流分析来确定条件表达式中哪些分支永远不会被执行。然后,编译器可以删除这些分支以提高程序的性能。

通过全局死代码消除,编译器可以在整个程序范围内找出并删除那些永远不会被执行的代码,从而提高程序的执行效率和性能。

跨过程分析:这种技术分析多个函数之间的关系,以便在全局范围内进行优化。

例如,编译器可能会识别出两个不同函数间的公共子表达式,并将其提取为一个单独的函数,从而减少代码重复。

跨过程分析(Interprocedural Analysis,IPA)是编译器优化的一种方法,它在全局范围内考虑多个函数之间的关系,以实现更高级的优化。通过分析多个函数之间的关系,编译器可以识别出更多的优化机会,从而提高程序的性能和执行效率。

以下是跨过程分析的一些应用:

  1. 函数内联:函数内联是一种优化技术,它将小函数的实现替换到调用位置,以减少函数调用开销。跨过程分析可以帮助编译器更准确地确定哪些函数适合进行内联。
  2. 公共子表达式消除:编译器可以通过跨过程分析识别两个不同函数间的公共子表达式,并将其提取为一个单独的函数。这样做可以减少代码重复,提高代码的可维护性和执行效率。
  3. 函数版本化:编译器可以根据函数的调用上下文创建多个版本。例如,如果一个函数在某些情况下接收常量参数,在这些情况下可以生成一个特殊的函数版本,从而减少运行时的开销。
  4. 函数参数优化:跨过程分析可以帮助编译器识别哪些函数参数在特定情况下始终保持相同的值。这些参数可以被视为常量,并在编译时进行优化。
  5. 死代码消除和代码移动:编译器可以通过分析多个函数之间的关系来确定哪些代码段在全局范围内是无用的或者可以移动的。这有助于编译器进行更精确的死代码消除和代码移动优化。

通过跨过程分析,编译器可以在全局范围内分析多个函数之间的关系,从而实现更高级的优化。这些优化有助于提高程序的执行效率和性能。

指针别名分析:这种技术分析指针变量之间的关系,以便更准确地确定它们是否指向相同的内存地址。

这有助于编译器进行更精确的优化,例如消除冗余的内存访问。

指针别名分析(Pointer Alias Analysis)是编译器优化中的一种重要技术。它分析指针变量之间的关系,以更准确地确定它们是否指向相同的内存地址。这种分析有助于编译器进行更精确的优化,例如消除冗余的内存访问,从而提高程序的执行效率和性能。

指针别名分析的主要目标是确定两个指针是否可能指向相同的内存位置。如果编译器能够确定两个指针不会指向相同的内存位置,那么它可以在不影响程序正确性的前提下进行一些优化。

以下是指针别名分析的一些应用:

  1. 冗余内存访问消除:如果编译器可以确定两个指针不会指向相同的内存位置,那么它可以消除冗余的内存访问。例如,如果两个指针 p 和 q 分别指向不同的内存位置,那么编译器可以将对 p 和 q 的多次访问合并为一次访问。
  2. 死代码消除:指针别名分析有助于识别那些永远不会被执行的代码。例如,如果编译器可以确定一个指针永远不会指向某个特定的内存地址,那么它可以将访问该内存地址的代码视为死代码并将其删除。
  3. 代码移动:通过分析指针别名关系,编译器可以确定哪些代码段可以在程序中移动,从而提高程序的执行效率。例如,如果一个循环中的指针访问不会影响其他循环迭代,那么编译器可以将这个访问移到循环外部。
  4. 并行性分析:指针别名分析可以帮助编译器确定程序中的哪些部分可以并行执行。例如,如果两个指针访问不同的内存位置,那么编译器可以认为这两个访问之间不存在数据依赖关系,从而允许它们并行执行。

通过指针别名分析,编译器可以在全局范围内分析指针变量之间的关系,从而实现更精确的优化。这些优化有助于提高程序的执行效率和性能。

代码布局优化:调整程序的代码布局,使经常一起执行的代码片段靠近,从而减少指令缓存的失效率和提高程序执行速度

代码布局优化(Code Layout Optimization)是一种编译器优化技术,旨在通过调整程序的代码布局来提高程序执行速度。编译器会将经常一起执行的代码片段放在靠近的位置,以减少指令缓存的失效率。这样,当处理器执行这些代码片段时,它们可以更快地从指令缓存中获取,从而提高程序的执行速度。

代码布局优化的主要方法包括:

  1. 基本块重排序:基本块是程序中的一个连续的指令序列,它们只有一个入口点和一个出口点。编译器可以根据程序的控制流信息将基本块重新排序,使经常一起执行的基本块相邻。
  2. 过程重排序:编译器可以调整函数在程序中的排列顺序,使经常一起调用的函数相邻。这有助于减少指令缓存失效率,从而提高程序执行速度。
  3. 热点代码提取:编译器可以识别程序中的热点代码(即执行频率较高的代码),并将它们放在一起。这有助于将热点代码加载到高速缓存中,从而提高程序的执行速度。
  4. 分支预测优化:编译器可以根据分支预测信息重新组织代码,以提高分支预测的准确性。这可以使处理器更高效地执行代码,从而提高程序的执行速度。

通过代码布局优化,编译器可以调整程序的代码布局,使经常一起执行的代码片段靠近,从而减少指令缓存的失效率和提高程序执行速度。这种优化技术在高性能计算和实时应用中尤为重要。

函数版本化:根据函数的调用上下文创建多个版本。例如,如果一个函数在某些情况下接收常量参数,在这些情况下可以生成一个特殊的函数版本,从而减少运行时的开销。

函数版本化(Function Versioning)是一种编译器优化技术,它根据函数的调用上下文创建多个版本。这种技术的目的是根据不同的使用场景生成针对性优化的函数版本,从而减少运行时的开销,提高程序执行效率。

以下是一些函数版本化的应用示例:

  1. 常量参数优化:当一个函数在某些情况下接收常量参数时,编译器可以为这些特定情况生成一个特殊的函数版本。这个特殊版本可以在编译时进行优化,从而减少运行时的开销。例如,编译器可以在编译时将常量参数传递给函数,以便在运行时不需要额外的计算。
  2. 数据类型优化:当一个函数需要处理不同类型的数据时,编译器可以为每种数据类型生成一个特定的函数版本。这样,编译器可以针对不同的数据类型进行优化,从而提高程序执行效率。
  3. 矢量化优化:当一个函数可以利用矢量指令进行并行计算时,编译器可以为该函数生成一个矢量化版本。矢量化版本的函数可以利用处理器的矢量指令集进行并行计算,从而提高程序执行速度。
  4. 根据硬件特性优化:编译器可以针对不同的硬件生成特定的函数版本,以充分利用硬件的特性进行优化。例如,编译器可以为具有特定指令集的处理器生成一个特定版本的函数,从而提高程序在该处理器上的执行效率。

通过函数版本化,编译器可以为函数生成多个针对性优化的版本,从而根据不同的使用场景提高程序执行效率。这种优化技术可以显著减少运行时的开销,提高程序性能。

结语

在本文中,我们系统地探讨了C++编译器全局优化技术。正如心理学所揭示,人类在处理复杂任务和全局思考方面具有显著的优势,而全局优化技术恰恰是利用计算机资源对整个程序进行优化的一种方法。通过学习和实践这些全局优化策略,程序员可以更好地发挥创新思维,提高代码的执行效率和质量。

掌握C++编译器全局优化技术需要时间和精力,但心理学告诉我们,保持专注和自信的态度将有助于更快地掌握这些知识。通过不断实践、思考和总结,您将在全局优化技术的探索中取得进步。

我们希望本文能够激发您对编程和全局优化技术的兴趣。心理学研究表明,兴趣和好奇心是驱动人类学习和进步的关键因素。如果您觉得本文内容有趣且有价值,请不吝收藏、点赞并分享给您的朋友,让更多的人了解和学习C++编译器全局优化技术。

最后,我们期待与您一起在编程和心理学的道路上不断前行。让我们共同努力,将C++编译器全局优化技术运用得更加熟练,提高程序性能,为人类的认知能力拓展和进步做出贡献。在这个快速发展的科技世界里,让我们携手共进,探索更多可能性,共创辉煌未来。

目录
相关文章
|
15天前
|
编译器 C语言 C++
【C++初阶(九)】C++模版(初阶)----函数模版与类模版
【C++初阶(九)】C++模版(初阶)----函数模版与类模版
19 0
|
26天前
|
存储 缓存 C++
C++链表常用的函数编写(增查删改)内附完整程序
C++链表常用的函数编写(增查删改)内附完整程序
|
28天前
|
存储 安全 编译器
【C++】类的六大默认成员函数及其特性(万字详解)
【C++】类的六大默认成员函数及其特性(万字详解)
35 3
|
1月前
|
安全 程序员 C++
【C++ 基本知识】现代C++内存管理:探究std::make_系列函数的力量
【C++ 基本知识】现代C++内存管理:探究std::make_系列函数的力量
101 0
|
5天前
|
存储 编译器 C语言
c++的学习之路:5、类和对象(1)
c++的学习之路:5、类和对象(1)
19 0
|
30天前
|
存储 C++ 容器
C++入门指南:string类文档详细解析(非常经典,建议收藏)
C++入门指南:string类文档详细解析(非常经典,建议收藏)
38 0
|
5天前
|
C++
c++的学习之路:7、类和对象(3)
c++的学习之路:7、类和对象(3)
19 0
|
4天前
|
设计模式 Java C++
【C++高阶(八)】单例模式&特殊类的设计
【C++高阶(八)】单例模式&特殊类的设计
|
4天前
|
编译器 C++
【C++基础(八)】类和对象(下)--初始化列表,友元,匿名对象
【C++基础(八)】类和对象(下)--初始化列表,友元,匿名对象
|
8天前
|
存储 安全 C语言
【C++】string类
【C++】string类