C++

重学C++系列(六)流程控制

Posted by YaPi on January 20, 2022

分支、循环

枚举
typedef enum __color{
    RED,
    GREEN,
    UNDEFINED
} color;

里面的值默认从0开始
分支

if /else

if () {
    
}else if (){

}

switch

若不加break,后续所有case都会执行

color c1;
c1 = RED;
switch (c1) {
    case RED:
        cout << RED << endl;
        break;
    case GREEN:
        cout << GREEN << endl;
    case UNDEFINED:
        cout << UNDEFINED <<endl;
    default:
        cout << "cnm" << endl;
}

使用场景

  1. switch 只支持常量值固定相等的分支判断;
  2. if还可以判断区间范围

性能分析

  1. if的汇编中,类似于一棵树,层层向下寻找合适的匹配,查找就会做跳转
  2. switch的汇编,会在开始形成一个类似表格的数据,一个一个去匹配,合适的再做跳转
  3. 分支多时,switch性能更好
  4. switch所有case的速度几乎一样
  5. if开始几个分支的效率高,后续递减

结构体内存布局

#include <iostream>
using namespace std;
// 设置内存为连续分配
#pragma pack(1)

int main() {
    // 内存布局
    // 联合体 union
    union Score {
        double sc;
        char level;
    };
    // 结构体
    //
    struct Student{
        char name[6];
        int age;
        Score s;
    };
    Score sc;
    Student s;
    strcpy(s.name,"name");
    cout << sizeof (sc) << endl; // 8
    cout << sizeof(s) << endl; // 24
    return 0; // text 代码区
}

32位cpu,4字节为一个单位存储 char : 任何地址 short : 偶数地址 int : 4的整数倍地址 double : 8的整数倍地址。

当没有设置内存编译选项的时候,结构体内存会以最大变量的范围为单位,去进行扩充。

比如:上述Student的内存,Score的大小为8,所以,虽然name的大小为6字节, age 的大小为4字节,但是它们都会扩充为8的倍数大小,而后,name分配8字节空间,占据6字节, age分配8字节空间,占据4字节。所以整个大小为24字节

有无办法让它们连续分配?

  • Visual C++ : # pragma pack(n)
  • g ++ : attribute(aligned(n)) 、attribute(packed)

函数重载

#include <iostream>
#include "math.h"
using namespace std;

int test(int a){
    return a;
}
int test(double a){
    return a;
}
// 默认值参数,在有默认值的参数之后的参数,必须有默认值
int test(int a=10,double b = 10){
    return a + b;
}

int main() {
    // 直接调用报错 编译器不知道是哪一个方法
    // int result = test(1);
    // 改为用指针 代表一个参数为int的函数
    int (*p)(int);
    p = test;
    int result = (*p)(1);
    cout << result << endl;

    return 0; // text 代码区
}
指向函数的指针与返回指针的函数

指向函数的指针:

每一个函数都占用一段内存单元,它们有一个起始地址,指向函数入口地址的指针称为函数指针。

一般形式:数据类型 (指针变量名)(参数表); 例子:int(p)(int); 这里的数据类型是指向函数的返回类型

返回指针的函数:

int* p(int); // 是函数,返回的值是一个指针

#include <iostream>
#include "math.h"
using namespace std;

int MaxValue(int a, int b){
    return (a > b) ? a:b;
}

int MinValue(int a, int b){
    return (a < b) ? a:b;
}

// 回调函数
bool ProcessNum(int a,int b,int(*p)(int a,int b)){
    cout << p(a,b) <<endl;
    return true;
}
int main() {
    int a = 10, y =20;
    ProcessNum(10,20,MaxValue); // 20
    ProcessNum(10,20,MinValue); // 10

    return 0; // text 代码区
}