鱼C论坛

 找回密码
 立即注册
查看: 149|回复: 2

[技术交流] C和C++的区别

[复制链接]
发表于 2025-4-19 17:28:20 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
以下是对C和C++的深度技术对比与分析,涵盖核心机制、内存模型、编程范式及现代特性:

---

### 1. **内存管理与底层操作**
#### **C语言**
- **显式内存管理**:通过`malloc`/`free`手动分配/释放堆内存,无自动垃圾回收。

  
  1. int *arr = (int*)malloc(10 * sizeof(int));
  2.   free(arr); // 必须显式释放
复制代码
  1. void* ptr = malloc(100);
  2.   int* int_ptr = (int*)ptr + 5; // 指针偏移到第5个int位置
复制代码
  1. #pragma pack(push, 1)
  2.   struct Data { char c; int i; }; // 取消默认对齐,总大小=5字节
  3.   #pragma pack(pop)
复制代码
  1. class Resource {
  2.       int* data;
  3.   public:
  4.       Resource() { data = new int[100]; } // 构造函数分配
  5.       ~Resource() { delete[] data; } // 析构函数释放
  6.   };
复制代码



- **移动语义**:通过右值引用(`&&`)避免深拷贝,提升性能。

  1. std::vector<int> v1 = {1,2,3};
  2.   std::vector<int> v2 = std::move(v1); // v1变为空,资源转移给v2
复制代码
  1. #define SWAP(a, b, type) { type temp = a; a = b; b = temp; }
  2.   SWAP(x, y, int); // 宏展开为int类型的交换代码
复制代码
  1. class Base {
  2.     public:
  3.         virtual void foo() { std::cout << "Base"; } // vtable入口
  4.     };
  5.     class Derived : public Base {
  6.         void foo() override { std::cout << "Derived"; }
  7.     };
  8.     Base* obj = new Derived();
  9.     obj->foo(); // 输出"Derived"(动态绑定)
复制代码
  1. class Interface {
  2.     public:
  3.         virtual void method() = 0; // 纯虚函数
  4.     };
复制代码
  1. template<typename T>
  2.     T max(T a, T b) { return (a > b) ? a : b; } // 类型推导
复制代码
  1. template<typename T>
  2.     requires std::integral<T> // C++20概念约束
  3.     T add(T a, T b) { return a + b; }
复制代码
  1. std::vector<int> vec = {3,1,4};
  2.   std::sort(vec.begin(), vec.end()); // 算法操作迭代器
复制代码
  1. for (auto it = vec.begin(); it != vec.end(); ++it) { /*...*/ }
  2.   // C++11范围for循环
  3.   for (int x : vec) { /*...*/ }
复制代码
  1. auto tpl = std::make_tuple(42, "hello", 3.14);
  2.   std::cout << std::get<1>(tpl); // 输出"hello"
复制代码
  1. class A { int x; virtual void f(); }; // 大小=8(int + vptr)
  2.   class B : public A { int y; }; // 大小=12(A部分 + int)
复制代码
  1. #define type_name(X) _Generic((X), int: "int", double: "double")
复制代码
  1. auto lambda = [](int x) { return x * 2; }; // 闭包对象
复制代码
  1. constexpr int factorial(int n) {
  2.       return (n <= 1) ? 1 : n * factorial(n-1);
  3.   }
  4.   static_assert(factorial(5) == 120); // 编译时计算
复制代码
  1. generator<int> range(int start, int end) {
  2.       for (int i = start; i < end; ++i)
  3.           co_yield i;
  4.   }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2025-4-19 17:30:00 | 显示全部楼层
C与C++深度技术对比(修正优化版)

---

1. 内存管理机制

  • C语言

    1. // 手动管理堆内存
    2. int* arr = (int*)malloc(10 * sizeof(int));
    3. free(arr);  // 必须显式释放

    4. // 直接内存操作
    5. void* ptr = malloc(100);
    6. int* int_ptr = (int*)ptr + 5;  // 指针偏移到第5个int位置
    复制代码

  • C++

    1. // RAII范式管理资源
    2. class Resource {
    3.     int* data;
    4. public:
    5.     Resource() { data = new int; }  // 构造分配
    6.     ~Resource() { delete data; }    // 析构释放
    7. };

    8. // 移动语义优化
    9. std::vector<int> v1 = {1,2,3};
    10. std::vector<int> v2 = std::move(v1);  // 资源转移,零拷贝
    复制代码


---

2. 编程范式支持

  • C语言

    1. // 面向过程编程
    2. #define SWAP(a, b, type) { type temp = a; a = b; b = temp; }
    3. SWAP(x, y, int);  // 通过宏实现代码复用
    复制代码

  • C++

    1. // 面向对象示例
    2. class Animal {
    3. public:
    4.     virtual void sound() = 0;  // 纯虚函数
    5. };
    6. class Dog : public Animal {
    7.     void sound() override { std::cout << "Woof"; }
    8. };

    9. // 函数式编程
    10. std::vector<int> vec = {2,5,1};
    11. std::sort(vec.begin(), vec.end(), [](int a, int b){ return a > b; });
    复制代码


---

3. 类型系统差异

  • C语言

    1. struct Point {  // 仅数据聚合
    2.     int x, y;
    3. };
    4. typedef struct Point Point;  // 需要显式类型重命名
    复制代码

  • C++

    1. template <typename T>  // 泛型编程
    2. T max(T a, T b) { return (a > b) ? a : b; }

    3. // C++20概念约束
    4. template<typename T>
    5. requires std::integral<T>
    6. T add(T a, T b) { return a + b; }
    复制代码


---

4. 标准库对比

  • C语言
    printf, qsort 等基础函数
  • C++

    1. // STL容器与算法
    2. std::vector<std::string> names {"Alice", "Bob"};
    3. std::unordered_map<int, std::string> id_map;

    4. // 现代迭代方式
    5. for (auto&& [key, val] : id_map) {
    6.     std::cout << key << ":" << val;
    7. }
    复制代码


---

核心差异总结
  • C强调过程化与底层控制,内存操作更自由但风险更高
  • C++通过OOP、泛型、现代特性构建抽象,在保持性能的同时提升开发效率
  • C++11/14/17/20持续引入constexprconceptsmodules等新特性


建议根据项目需求选择:系统级底层开发优先C,大型应用开发优选C++。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2025-5-1 21:18:33 | 显示全部楼层
c++新增包括类和对象,函数重载,运算符重载等方法,C++=C plus plus
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-5-9 23:09

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表