首页 > 编程语言 >C++ 第四节课 C和C++指针的区别 C的宏函数和C++内联函数的优缺点

C++ 第四节课 C和C++指针的区别 C的宏函数和C++内联函数的优缺点

时间:2024-02-22 23:22:26浏览次数:22  
标签:const 函数 int C++ 编辑器 内联

#include <iostream>


// 定义一个宏函数
#define ADD(x,y) x+y;
// 宏函数具有速度快等特点 但是写代码有些业务比较繁琐,所以C++中使用了内联函数优化

// 在定义函数前面添加一个inline把这个函数变成内联函数
inline int max(int x,int y) {
    return x > y ? x : y;
}
using namespace std;
int main() {
    const int a = 10; // const 修饰的是 int a
    int* p = (int*)&a;  // &a 的类型是 int *a 所以要强制转换
    *p = 1;  // 并没有改变 a 的值 依然是 1000
    // 1. C和C++指针的区别
    /// 为什么没有改变呢 ??
    /// 这与C++的编辑器有关,实际上 a 变量的地址的值已经改变了 但是当程序使用当了 a 时候,编辑器会直接从寄存器取值
    ///  而不是从地址中取值
    /// 当cosnt修饰这个变量如果是一个立即数,编辑器就会把这个值直接放在寄存器中   在程序中如果出现这个变量时
    /// 编辑器直接i把a 以一个立即的方式直接替换
    /// 如果想要编辑器老老实实去地址中取值 使用 volite 进行修饰
    int arr[a] = {11};   /// 规定了数组的长度为 10 不够的话自动补零
    /// 和 C 的区别 C中const定义的变量可以通过指针修改 而C++中不行
    /// 使用常量 推荐使用 const 修饰 而不是 使用宏定义 defined
    /// C++ 是面向大型程序的 所以要更加严谨一些
    int k;
    for(k = 0;k < 10;k++){
       cout << arr[k] << endl;
    }
    cout << a << endl << arr << endl << p << endl;

    // 2. 内联函数
    ///
    int j = 10;
    int z = 20;
    // cout << ADD(j,z) << endl;
    cout << max(++j,++z) << endl;  /// 使用内联函数是和宏函数一样的 直接替换   内联函数直接在当前替换 return 值
    /// 内联函数既保证了代码的运行的高效性,同时也解决了宏函数Bug的存在
    /// 但是使用宏函数也是有代价的,只能使用简短的代码且没有循环且没有耗时操作的函数才可以
    /// 如果内联函数比较复杂,导致代码膨胀(某个地方使用 100 万次内联函数)
    /// 普通函数的调用过程 1. 函数形参的入栈 》》函数地址的跳转 》》 栈帧的开辟 》》函数的返回及返回值的保存 》》 栈帧的回退
    /// 普通函数调用的优势:调用完之后,就不存在了 不像内联函数那样是直接替换代码的 执行完之后依然存在
    /// 所以对于普通函数 来说,最终的可执行程序代码量不会膨胀。

    return 0;
}

 

标签:const,函数,int,C++,编辑器,内联
From: https://www.cnblogs.com/zhulongxu/p/18028414

相关文章

  • c++ 通过一个临时的空的智能指针(裸指针),交换两个智能指针(裸指针)的值,注意是交换值!!!!
    #include<iostream>#include<memory>usingnamespacestd;structParenTask//父亲{stringname{};};typedefshared_ptr<ParenTask>ParenTaskPtr;structSubTask:ParenTask//孩子{intuid{};};typedefshared_ptr<SubTask&g......
  • Java 构造函数与修饰符详解:初始化对象与控制权限
    Java构造函数Java构造函数是一种特殊的类方法,用于在创建对象时初始化对象的属性。它与类名相同,并且没有返回值类型。构造函数的作用:为对象的属性设置初始值执行必要的初始化操作提供创建对象的多种方式构造函数的类型:默认构造函数:无参数的构造函数,如果用户没有明......
  • M1 MacOS 配置C++环境时遇到的插件问题
    配置环境参照博客:https://www.cnblogs.com/BYGAO/p/15135609.html遇到问题:在Terminal--ConfigureDefaultBuildTasks--C/C++clang++这一步没有C/C++clang++选项。解决方法:shift+command+p打开搜索框,搜索SettingsSync:ShowSettings在IgnoredExtensions中打......
  • C++ 第三节课 指针的使用
    #include<iostream>usingnamespacestd;voidshow(){cout<<"全局函数"<<endl;}structStu{inta;voidwrite_code(){cout<<"成员函数"<<endl;}};intmain(){cout<<......
  • 11. 盛最多水的容器C++
    原本想o(n2)遍历的,结果超时了,果然没这么简单就解决。classSolution{public:ints(vector<int>height,inti,intj){ints1=min(height[i],height[j])*(j-i);returns1;}intmaxArea(vector<int>&height){intmax=0,i=0,j=heigh......
  • 深入理解C++中的堆与栈:内存管理的关键区别与实例解析
     概述:C++中,堆和栈是两种不同的内存分配方式。栈自动分配、释放内存,适用于短生命周期变量;堆需要手动管理,适用于动态分配内存,但需要显式释放以防内存泄漏。通过清晰的示例源代码,演示了它们在变量生命周期、访问方式等方面的区别。C++中的堆(heap)和栈(stack)是两种内存分配和管理方......
  • Python笔记11——函数
    十一、函数函数的作用:提高模块化程度,提高代码重复利用率。11.1定义一个函数一般格式:def函数名(参数列表):函数体以def关键字开头,后接函数标识符名称和圆括号()。所需参数必须都在圆括号中声明。(默认参数值和参数名称是按函数声明中定义的顺序匹配起来的。)函数内容以......
  • C++ 继承和派生
      ......
  • SQL Server中文大写金额转化函数
    SQLServer中文金额、大写金额:CREATEFUNCTIONfn_GetChineseCost(@Costfloat)RETURNSvarchar(50)AS----大写金额----BEGINdeclare@returnStrvarchar(50)if(@Cost>=1000000000)Beginset@returnStr='##########'......
  • C++ 多态 超详细讲解
    C++多态超详细讲解多态概念引入多态字面意思就是多种形态。我们先来想一想在日常生活中的多态例子:买票时,成人买票全价,如果是学生那么半价,如果是军人,就可以优先买票。不同的人买票会有不同的实现方法,这就是多态。1、C++中多态的实现1.1多态的构成条件C++的多态必须满足两......