ITPub博客

首页 > 应用开发 > IT综合 > C++类型系统深度解析:内置类型与自定义类型的对比

C++类型系统深度解析:内置类型与自定义类型的对比

投稿 IT综合 作者:bhluo 时间:2025-12-04 15:30:21 0 删除 编辑

# C++类型系统深度解析:内置类型与自定义类型的对比


## 引言:类型系统的核心价值


在C++编程中,类型系统不仅是语法的基础,更是程序安全性和性能的保障。从基本的内置类型到复杂的自定义类型,理解它们的特性、差异和适用场景,对于编写高效可靠的代码至关重要。本文将深入探讨C++类型系统的内在机制,对比分析内置类型与自定义类型的设计哲学和应用实践。


## 第一部分:内置类型体系


### 基础类型特性


```cpp

#include <iostream>

#include <type_traits>

#include <limits>


void basic_type_properties() {

    std::cout << "=== C++内置类型特性 ===" << std::endl;

    

    // 1. 整数类型

    std::cout << "\n整数类型:" << std::endl;

    std::cout << "char 大小: " << sizeof(char) << " 字节" 

              << ",范围: " << (int)std::numeric_limits<char>::min() 

              << " 到 " << (int)std::numeric_limits<char>::max() << std::endl;

    

    std::cout << "int 大小: " << sizeof(int) << " 字节" 

              << ",范围: " << std::numeric_limits<int>::min() 

              << " 到 " << std::numeric_limits<int>::max() << std::endl;

    

    std::cout << "long long 大小: " << sizeof(long long) << " 字节" 

              << ",范围: " << std::numeric_limits<long long>::min() 

              << " 到 " << std::numeric_limits<long long>::max() << std::endl;

    

    // 2. 浮点类型

    std::cout << "\n浮点类型:" << std::endl;

    std::cout << "float 大小: " << sizeof(float) << " 字节" 

              << ",精度: " << std::numeric_limits<float>::digits10 << " 位" << std::endl;

    

    std::cout << "double 大小: " << sizeof(double) << " 字节" 

              << ",精度: " << std::numeric_limits<double>::digits10 << " 位" << std::endl;

    

    std::cout << "long double 大小: " << sizeof(long double) << " 字节" 

              << ",精度: " << std::numeric_limits<long double>::digits10 << " 位" << std::endl;

    

    // 3. 类型特性查询

    std::cout << "\n类型特性:" << std::endl;

    std::cout << "int 是否有符号: " << std::is_signed<int>::value << std::endl;

    std::cout << "char 是否有符号: " << std::is_signed<char>::value << " (实现定义)" << std::endl;

    std::cout << "double 是浮点数: " << std::is_floating_point<double>::value << std::endl;

    std::cout << "void* 是指针: " << std::is_pointer<void*>::value << std::endl;

}


// 类型别名和类型推导

void type_aliases_and_deduction() {

    std::cout << "\n=== 类型别名与推导 ===" << std::endl;

    

    // 1. 类型别名

    using Byte = unsigned char;

    using IntPtr = int*;

    using Array10 = int[10];

    

    Byte b = 255;

    IntPtr p = nullptr;

    Array10 arr = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};

    

    std::cout << "Byte 大小: " << sizeof(Byte) << std::endl;

    std::cout << "Array10 大小: " << sizeof(Array10) << std::endl;

    

    // 2. auto 类型推导

    auto x = 42;            // int

    auto y = 3.14;          // double

    auto z = "Hello";       // const char*

    

    std::cout << "\nauto 推导结果:" << std::endl;

    std::cout << "x 类型: " << typeid(x).name() << std::endl;

    std::cout << "y 类型: " << typeid(y).name() << std::endl;

    std::cout << "z 类型: " << typeid(z).name() << std::endl;

    

    // 3. decltype 类型查询

    int i = 10;

    const int& ri = i;

    decltype(ri) rj = i;    // const int&

    decltype(i) j = 20;     // int

    

    std::cout << "\ndecltype 示例:" << std::endl;

    std::cout << "ri 类型: " << typeid(ri).name() << std::endl;

    std::cout << "rj 类型: " << typeid(rj).name() << std::endl;

}


// 内置类型的操作特性

void builtin_type_operations() {

    std::cout << "\n=== 内置类型操作 ===" << std::endl;

    

    // 1. 算术运算

    int a = 10, b = 3;

    std::cout << "整数运算:" << std::endl;

    std::cout << a << " + " << b << " = " << a + b << std::endl;

    std::cout << a << " / " << b << " = " << a / b << " (整数除法)" << std::endl;

    

    double da = 10.0, db = 3.0;

    std::cout << "\n浮点运算:" << std::endl;

    std::cout << da << " / " << db << " = " << da / db << " (浮点除法)" << std::endl;

    

    // 2. 位运算

    unsigned int flags = 0b1010;  // 二进制字面量

    unsigned int mask = 0b0010;

    

    std::cout << "\n位运算:" << std::endl;

    std::cout << "flags: " << std::bitset<8>(flags) << std::endl;

    std::cout << "flags & mask: " << std::bitset<8>(flags & mask) << std::endl;

    std::cout << "flags | mask: " << std::bitset<8>(flags | mask) << std::endl;

    

    // 3. 指针运算

    int array[5] = {10, 20, 30, 40, 50};

    int* ptr = array;

    

    std::cout << "\n指针运算:" << std::endl;

    std::cout << "*ptr = " << *ptr << std::endl;

    std::cout << "*(ptr + 2) = " << *(ptr + 2) << std::endl;

    std::cout << "ptr[3] = " << ptr[3] << std::endl;

}

```


### 类型转换与提升


```cpp

#include <typeinfo>


void type_conversion_and_promotion() {

    std::cout << "=== 内置类型转换 ===" << std::endl;

    

    // 1. 隐式类型转换

    std::cout << "\n隐式转换:" << std::endl;

    

    char c = 'A';

    int i = c;              // 整型提升:char → int

    std::cout << "char 'A' → int: " << i << std::endl;

    

    int num = 42;

    double d = num;         // 浮点提升:int → double

    std::cout << "int 42 → double: " << d << std::endl;

    

    // 2. 算术转换

    std::cout << "\n算术转换:" << std::endl;

    

    int x = 10;

    double y = 3.14;

    auto result1 = x + y;   // int提升为double

    std::cout << "int + double → " << typeid(result1).name() 

              << ": " << result1 << std::endl;

    

    unsigned int u = 100;

    int s = -50;

    auto result2 = u + s;   // 有符号转为无符号

    std::cout << "unsigned + signed → " << typeid(result2).name() 

              << ": " << result2 << std::endl;

    

    // 3. 显式类型转换

    std::cout << "\n显式转换:" << std::endl;

    

    double pi = 3.14159;

    int int_pi = static_cast<int>(pi);  // 截断

    std::cout << "static_cast<double → int>: " << int_pi << std::endl;

    

    void* vptr = &pi;

    double* dptr = static_cast<double*>(vptr);  // void*转换

    std::cout << "通过void*转换后的值: " << *dptr << std::endl;

    

    // 4. 类型退化

    std::cout << "\n类型退化:" << std::endl;

    

    int arr[5] = {1, 2, 3, 4, 5};

    std::cout << "数组类型: " << typeid(arr).name() << std::endl;

    

    auto decayed = arr;      // 数组退化为指针

    std::cout << "退化后类型: " << typeid(decayed).name() << std::endl;

}

```


## 第二部分:自定义类型体系


### 结构体与类


```cpp

#include <string>

#include <iostream>


// 1. 结构体(默认public访问权限)

struct Point {

    // 数据成员

    double x;

    double y;

    

    // 构造函数

    Point(double x_val = 0.0, double y_val = 0.0) 

        : x(x_val), y(y_val) {}

    

    // 成员函数

    void move(double dx, double dy) {

        x += dx;

        y += dy;

    }

    

    double distance_to_origin() const {

        return std::sqrt(x * x + y * y);

    }

    

    // 运算符重载

    Point operator+(const Point& other) const {

        return Point(x + other.x, y + other.y);

    }

    

    // 类型转换运算符

    operator std::string() const {

        return "(" + std::to_string(x) + ", " + std::to_string(y) + ")";

    }

};


// 2. 类(默认private访问权限)

class Circle {

private:

    Point center;

    double radius;

    

public:

    // 构造函数

    Circle(const Point& c = Point(), double r = 1.0)

        : center(c), radius(r) {

        if (radius <= 0) {

            throw std::invalid_argument("半径必须为正数");

        }

    }

    

    // 访问器(getter)

    Point get_center() const { return center; }

    double get_radius() const { return radius; }

    

    // 修改器(setter)

    void set_center(const Point& c) { center = c; }

    void set_radius(double r) {

        if (r <= 0) throw std::invalid_argument("半径必须为正数");

        radius = r;

    }

    

    // 业务方法

    double area() const {

        return 3.14159 * radius * radius;

    }

    

    double circumference() const {

        return 2 * 3.14159 * radius;

    }

    

    bool contains(const Point& p) const {

        double dx = p.x - center.x;

        double dy = p.y - center.y;

        return (dx * dx + dy * dy) <= (radius * radius);

    }

    

    // 友元函数

    friend std::ostream& operator<<(std::ostream& os, const Circle& c);

};


std::ostream& operator<<(std::ostream& os, const Circle& c) {

    os << "Circle{center=(" << c.center.x << ", " << c.center.y 

       << "), radius=" << c.radius << "}";

    return os;

}


void class_vs_struct_demo() {

    std::cout << "=== 类与结构体对比 ===" << std::endl;

    

    // 结构体使用

    Point p1(1.0, 2.0);

    Point p2(3.0, 4.0);

    

    std::cout << "\n结构体示例:" << std::endl;

    std::cout << "p1: " << static_cast<std::string>(p1) << std::endl;

    std::cout << "p2: " << static_cast<std::string>(p2) << std::endl;

    

    Point p3 = p1 + p2;

    std::cout << "p1 + p2 = " << static_cast<std::string>(p3) << std::endl;

    

    // 类使用

    Circle c(p1, 5.0);

    

    std::cout << "\n类示例:" << std::endl;

    std::cout << c << std::endl;

    std::cout << "面积: " << c.area() << std::endl;

    std::cout << "周长: " << c.circumference() << std::endl;

    

    Point test_point(2.0, 3.0);

    std::cout << "点" << static_cast<std::string>(test_point) 

              << " 在圆内: " << std::boolalpha << c.contains(test_point) << std::endl;

}


// 3. 枚举类(强类型枚举)

enum class Color : uint8_t {

    Red = 1,

    Green = 2,

    Blue = 3,

    Yellow = Red | Green  // 位运算组合

};


enum class Priority : int {

    Low = 1,

    Medium = 2,

    High = 3

};


class TrafficLight {

private:

    Color current_color;

    

public:

    TrafficLight() : current_color(Color::Red) {}

    

    void change() {

        switch (current_color) {

            case Color::Red:

                current_color = Color::Green;

                break;

            case Color::Green:

                current_color = Color::Yellow;

                break;

            case Color::Yellow:

                current_color = Color::Red;

                break;

            default:

                break;

<"tiantian.juchengbibu.com">

<"tt.aekt.cn">

<"tt.baiyng.com">

        }

    }

    

    Color get_color() const { return current_color; }

    

    std::string color_name() const {

        switch (current_color) {

            case Color::Red: return "Red";

            case Color::Green: return "Green";

            case Color::Blue: return "Blue";

            case Color::Yellow: return "Yellow";

            default: return "Unknown";

        }

    }

};


void enum_class_demo() {

    std::cout << "\n=== 枚举类示例 ===" << std::endl;

    

    TrafficLight light;

    

    std::cout << "初始颜色: " << light.color_name() << std::endl;

    

    light.change();

    std::cout << "第一次变化: " << light.color_name() << std::endl;

    

    light.change();

    std::cout << "第二次变化: " << light.color_name() << std::endl;

    

    // 枚举类的类型安全

    Color color = Color::Red;

    Priority priority = Priority::High;

    

    // 错误:不能直接比较不同的枚举类

    // if (color == priority) { ... }

    

    // 正确:显式转换后比较

    if (static_cast<int>(color) == static_cast<int>(priority)) {

        std::cout << "数值相等但类型不同" << std::endl;

    }

}

```


### 高级自定义类型


```cpp

#include <memory>

#include <vector>

#include <algorithm>


// 1. 模板类

template<typename T>

class Container {

private:

    std::vector<T> items;

    

public:

    Container() = default;

    

    void add(const T& item) {

        items.push_back(item);

    }

    

    void remove(const T& item) {

        items.erase(std::remove(items.begin(), items.end(), item), items.end());

    }

    

    bool contains(const T& item) const {

        return std::find(items.begin(), items.end(), item) != items.end();

    }

    

    size_t size() const {

        return items.size();

    }

    

    // 迭代器支持

    typename std::vector<T>::iterator begin() { return items.begin(); }

    typename std::vector<T>::iterator end() { return items.end(); }

    typename std::vector<T>::const_iterator begin() const { return items.begin(); }

    typename std::vector<T>::const_iterator end() const { return items.end(); }

};


// 2. 继承与多态

class Shape {

public:

    virtual ~Shape() = default;

    

    virtual double area() const = 0;

    virtual double perimeter() const = 0;

    virtual void draw() const = 0;

    

    virtual std::string type() const {

        return "Shape";

    }

};


class Rectangle : public Shape {

private:

    double width;

    double height;

    

public:

    Rectangle(double w, double h) : width(w), height(h) {

        if (w <= 0 || h <= 0) {

            throw std::invalid_argument("宽度和高度必须为正数");

        }

    }

    

    double area() const override {

        return width * height;

    }

    

    double perimeter() const override {

        return 2 * (width + height);

    }<"tt.fajining.com">

    

    void draw() const override {

        std::cout << "绘制矩形: " << width << "x" << height << std::endl;

    }

    

    std::string type() const override {

        return "Rectangle";

    }

};


class Triangle : public Shape {

private:

    double a, b, c;  // 三边长度

    

public:

    Triangle(double side1, double side2, double side3) 

        : a(side1), b(side2), c(side3) {

        if (!is_valid()) {

            throw std::invalid_argument("无效的三角形边长");

        }

    }

    

    double area() const override {

        // 海伦公式

        double s = perimeter() / 2;

        return std::sqrt(s * (s - a) * (s - b) * (s - c));

    }

    

    double perimeter() const override {

        return a + b + c;

    }

    

    void draw() const override {

        std::cout << "绘制三角形: 边长(" << a << ", " << b << ", " << c << ")" << std::endl;

    }

    

    std::string type() const override {

        return "Triangle";

    }

    

private:

    bool is_valid() const {

        return (a > 0 && b > 0 && c > 0) &&

               (a + b > c) && (a + c > b) && (b + c > a);

    }

};


// 3. 智能指针作为自定义类型的一部分

class ResourceManager {

private:

    class Resource {

    public:

        std::string name;

        std::vector<int> data;

        

        Resource(const std::string& n, size_t size) : name(n), data(size) {

            std::cout << "创建资源: " << name << std::endl;

        }

        

        ~Resource() {

            std::cout << "销毁资源: " << name << std::endl;

        }

        

        void process() {

            std::cout << "处理资源: " << name 

                      << ", 大小: " << data.size() << std::endl;

        }

    };

    

    std::vector<std::shared_ptr<Resource>> resources;

    

public:

    std::shared_ptr<Resource> create_resource(const std::string& name, size_t size) {

        auto resource = std::make_shared<Resource>(name, size);

        resources.push_back(resource);

        return resource;

    }

    

    void cleanup() {

        // 移除所有未使用的资源

        resources.erase(

            std::remove_if(resources.begin(), resources.end(),

                [](const std::shared_ptr<Resource>& res) {

                    return res.use_count() == 1;  // 只有资源管理器持有

                }),

            resources.end()

        );

    }

    

    size_t count_resources() const {

        return resources.size();

    }<"tt.dongzei.com">

};


void advanced_types_demo() {

    std::cout << "=== 高级自定义类型示例 ===" << std::endl;

    

    // 模板类使用

    Container<int> int_container;

    int_container.add(10);

    int_container.add(20);

    int_container.add(30);

    

    std::cout << "\n模板容器:" << std::endl;

    std::cout << "容器大小: " << int_container.size() << std::endl;

    std::cout << "包含20: " << std::boolalpha << int_container.contains(20) << std::endl;

    

    // 继承与多态

    std::vector<std::unique_ptr<Shape>> shapes;

    shapes.push_back(std::make_unique<Rectangle>(3.0, 4.0));

    shapes.push_back(std::make_unique<Triangle>(3.0, 4.0, 5.0));

    

    std::cout << "\n多态形状:" << std::endl;

    for (const auto& shape : shapes) {

        std::cout << shape->type() 

                  << " - 面积: " << shape->area()

                  << ", 周长: " << shape->perimeter() << std::endl;

        shape->draw();

    }

    

    // 智能指针管理

    ResourceManager manager;

    

    std::cout << "\n资源管理:" << std::endl;

    auto res1 = manager.create_resource("Data1", 100);

    auto res2 = manager.create_resource("Data2", 200);

    

    {

        auto res3 = manager.create_resource("Data3", 300);

        res3->process();

        std::cout << "临时资源计数: " << manager.count_resources() << std::endl;

    }

    

    std::cout << "临时资源离开作用域后计数: " << manager.count_resources() << std::endl;

    

    manager.cleanup();

    std::cout << "清理后计数: " << manager.count_resources() << std::endl;

}

```


## 第三部分:类型特性对比分析


### 内存布局与对齐


```cpp

#include <iostream>

#include <cstddef>

#include <type_traits>


struct MemoryLayoutExample {

    char c;     // 1字节

    int i;      // 4字节(可能需要对齐)

    double d;   // 8字节

    short s;    // 2字节

};


struct PackedLayout {

    char c;

    int i;

    double d;

    short s;

} __attribute__((packed));  // GCC/Clang打包属性


#pragma pack(push, 1)

struct PackedLayoutMSVC {

    char c;

    int i;

    double d;

    short s;

};

#pragma pack(pop)


class VirtualClass {

public:

    virtual void method() {}  // 添加虚函数表指针

    int data;

};


void memory_layout_analysis() {

    std::cout << "=== 内存布局对比 ===" << std::endl;

    

    // 内置类型

    std::cout << "\n内置类型大小:" << std::endl;

    std::cout << "char: " << sizeof(char) << " 字节" << std::endl;

    std::cout << "int: " << sizeof(int) << " 字节" << std::endl;

    std::cout << "double: " << sizeof(double) << " 字节" << std::endl;

    std::cout << "void*: " << sizeof(void*) << " 字节" << std::endl;

    

    // 结构体内存布局

    std::cout << "\n结构体内存布局:" << std::endl;

    std::cout << "MemoryLayoutExample 大小: " << sizeof(MemoryLayoutExample) 

              << " 字节" << std::endl;

    std::cout << "对齐要求: " << alignof(MemoryLayoutExample) << " 字节" << std::endl;

    

    std::cout << "成员偏移量:" << std::endl;

    std::cout << "  c: " << offsetof(MemoryLayoutExample, c) << std::endl;

    std::cout << "  i: " << offsetof(MemoryLayoutExample, i) << std::endl;

    std::cout << "  d: " << offsetof(MemoryLayoutExample, d) << std::endl;

    std::cout << "  s: " << offsetof(MemoryLayoutExample, s) << std::endl;

    

    // 打包结构

    std::cout << "\n打包结构大小: " << sizeof(PackedLayout) << " 字节" << std::endl;

    

    // 类与结构体对比

    std::cout << "\n类与结构体对比:" << std::endl;

    struct PlainStruct {

        int a, b, c;

    };

    

    class PlainClass {

        int a, b, c;

    public:

        PlainClass(int x, int y, int z) : a(x), b(y), c(z) {}

    };<"tt.bajilin.com">

    

    std::cout << "PlainStruct 大小: " << sizeof(PlainStruct) << std::endl;

    std::cout << "PlainClass 大小: " << sizeof(PlainClass) << std::endl;

    

    // 多态类

    std::cout << "\n多态类内存开销:" << std::endl;

    std::cout << "VirtualClass 大小: " << sizeof(VirtualClass) << std::endl;

    std::cout << "虚函数表指针大小: " << sizeof(void*) << std::endl;

    

    // 空类

    class EmptyClass {};

    

    std::cout << "\n空类大小: " << sizeof(EmptyClass) << " 字节" << std::endl;

    std::cout << "空类对齐: " << alignof(EmptyClass) << " 字节" << std::endl;

}


// 类型特性工具类

template<typename T>

void print_type_info(const char* name) {

    std::cout << name << ":" << std::endl;

    std::cout << "  大小: " << sizeof(T) << " 字节" << std::endl;

    std::cout << "  对齐: " << alignof(T) << std::endl;

    std::cout << "  平凡可复制: " << std::is_trivially_copyable<T>::value << std::endl;

    std::cout << "  标准布局: " << std::is_standard_layout<T>::value << std::endl;

    std::cout << "  POD类型: " << std::is_pod<T>::value << std::endl;

}


void type_traits_comparison() {

    std::cout << "\n=== 类型特性对比 ===" << std::endl;

    

    // 内置类型

    print_type_info<int>("int");

    print_type_info<double>("double");

    

    // 自定义类型

    struct TrivialStruct {

        int x;

        double y;

    };

    

    class NonTrivialClass {

        std::string data;  // 包含非平凡类型

    public:

        NonTrivialClass() {}

        ~NonTrivialClass() {}

    };

    

    print_type_info<TrivialStruct>("TrivialStruct");

    print_type_info<NonTrivialClass>("NonTrivialClass");

}

```


### 性能特性对比


```cpp

#include <chrono>

#include <vector>

#include <algorithm>


class PerformanceAnalyzer {

public:

    template<typename Func>

    static double measure_time(Func func, int iterations = 1000) {

        auto start = std::chrono::high_resolution_clock::now();

        

        for (int i = 0; i < iterations; ++i) {

            func();

        }

        

        auto end = std::chrono::high_resolution_clock::now();

        return std::chrono::duration<double, std::micro>(end - start).count() / iterations;

    }

};


// 性能测试类型

struct Point2D {

    double x, y;

    

    Point2D(double x = 0, double y = 0) : x(x), y(y) {}

    

    Point2D operator+(const Point2D& other) const {

        return Point2D(x + other.x, y + other.y);

    }

    

    double dot(const Point2D& other) const {

        return x * other.x + y * other.y;

    }

};


class Point2DClass {

private:

    double x_, y_;

    

public:

    Point2DClass(double x = 0, double y = 0) : x_(x), y_(y) {}

    

    Point2DClass add(const Point2DClass& other) const {

        return Point2DClass(x_ + other.x_, y_ + other.y_);

    }

    

    double dot(const Point2DClass& other) const {

        return x_ * other.x_ + y_ * other.y_;

    }

    

    double x() const { return x_; }

    double y() const { return y_; }

};


void performance_comparison() {

    std::cout << "=== 性能特性对比 ===" << std::endl;

    

    const int size = 10000;

    const int iterations = 100;

    

    // 1. 内存访问模式测试

    std::cout << "\n1. 内存访问模式测试:" << std::endl;

    

    // 内置类型数组

    std::vector<double> builtin_array(size);

    for (int i = 0; i < size; ++i) {

        builtin_array[i] = i * 0.1;

    }

    

    // 结构体数组

    std::vector<Point2D> struct_array(size);

    for (int i = 0; i < size; ++i) {

        struct_array[i] = Point2D(i * 0.1, i * 0.2);

    }

    

    // 类对象数组

    std::vector<Point2DClass> class_array;

    class_array.reserve(size);

    for (int i = 0; i < size; ++i) {

        class_array.emplace_back(i * 0.1, i * 0.2);

    }

    

    // 测试求和操作

    auto builtin_sum = [&]() {

        double sum = 0;

        for (const auto& val : builtin_array) {

            sum += val;

        }

        return sum;

    };

    

    auto struct_sum = [&]() {

        Point2D sum;

        for (const auto& point : struct_array) {

            sum = sum + point;

        }

        return sum;

    };

    

    auto class_sum = [&]() {

        Point2DClass sum;

        for (const auto& point : class_array) {

            sum = sum.add(point);

        }

        return sum;

    };

    

    double time_builtin = PerformanceAnalyzer::measure_time(builtin_sum, iterations);

    double time_struct = PerformanceAnalyzer::measure_time(struct_sum, iterations);

    double time_class = PerformanceAnalyzer::measure_time(class_sum, iterations);

    

    std::cout << "内置类型数组求和: " << time_builtin << " μs" << std::endl;

    std::cout << "结构体数组求和: " << time_struct << " μs" << std::endl;

    std::cout << "类对象数组求和: " << time_class << " μs" << std::endl;

    

    // 2. 函数调用开销测试

    std::cout << "\n2. 函数调用开销测试:" << std::endl;

    

    auto test_inline = []() {

        volatile int result = 0;  // 防止优化

        for (int i = 0; i < 1000; ++i) {

            result += i * i;  // 内联操作

        }

        return result;

    };

    

    // 非内联函数

    int __attribute__((noinline)) non_inline_compute(int n) {

        volatile int result = 0;

        for (int i = 0; i < n; ++i) {

            result += i * i;

        }

        return result;

    }

    

    auto test_non_inline = [&]() {

        return non_inline_compute(1000);

    };

    

    double time_inline = PerformanceAnalyzer::measure_time(test_inline, 10000);

    double time_non_inline = PerformanceAnalyzer::measure_time(test_non_inline, 10000);

    

    std::cout << "内联操作: " << time_inline << " μs" << std::endl;

    std::cout << "非内联函数调用: " << time_non_inline << " μs" << std::endl;

    std::cout << "调用开销: " << (time_non_inline - time_inline) << " μs" << std::endl;

    

    // 3. 虚函数调用开销

    std::cout << "\n3. 虚函数调用开销测试:" << std::endl;

    

    class Base {

    public:

        virtual int compute() { return 0; }

        virtual ~Base() = default;

    };

    

    class Derived : public Base {

    public:

        int compute() override { return 42; }

    };

    

    std::vector<std::unique_ptr<Base>> objects(1000);

    for (auto& obj : objects) {

        obj = std::make_unique<Derived>();

    }

    

    auto test_virtual = [&]() {

        int sum = 0;

        for (const auto& obj : objects) {

            sum += obj->compute();

        }

        return sum;

    };

    

    // 对比非虚函数

    class NonVirtual {

    public:

        int compute() { return 42; }

    };

    

    std::vector<NonVirtual> non_virtual_objects(1000);

    

    auto test_non_virtual = [&]() {

        int sum = 0;

        for (auto& obj : non_virtual_objects) {

            sum += obj.compute();

        }

        return sum;

    };

    

    double time_virtual = PerformanceAnalyzer::measure_time(test_virtual, 1000);

    double time_non_virtual = PerformanceAnalyzer::measure_time(test_non_virtual, 1000);

    

    std::cout << "虚函数调用: " << time_virtual << " μs" << std::endl;

    std::cout << "非虚函数调用: " << time_non_virtual << " μs" << std::endl;

    std::cout << "虚函数开销: " << (time_virtual - time_non_virtual) << " μs" << std::endl;

}

```


## 第四部分:类型选择策略


### 类型选择决策树


```cpp

#include <iostream>

#include <string>

#include <type_traits>


class TypeSelectionGuide {

public:

    enum class UseCase {

        DATA_CONTAINER,     // 数据容器

        BUSINESS_LOGIC,     // 业务逻辑

        INTERFACE,          // 接口定义

        ALGORITHM,          // 算法实现

        RESOURCE_MANAGER,   // 资源管理

        CONFIGURATION       // 配置数据

    };

    

    enum class PerformanceRequirement {

        CRITICAL,           // 性能关键

        IMPORTANT,          // 性能重要

        MODERATE,           // 性能适中

        LOW                 // 性能要求低

    };

    

    enum class MemoryConstraint {

        EXTREME,            // 极度受限

        TIGHT,              // 严格限制

        MODERATE,           // 适中限制

        GENEROUS            // 限制宽松

    };

    

    struct Requirements {

        UseCase use_case;

        PerformanceRequirement performance;

        MemoryConstraint memory;

        bool requires_polymorphism;

        bool needs_encapsulation;

        bool will_be_copied_frequently;

    };

    

    static std::string recommend_type(const Requirements& req) {

        // 决策逻辑

        if (req.use_case == UseCase::DATA_CONTAINER) {

            if (req.memory == MemoryConstraint::EXTREME) {

                return "使用内置类型数组或std::array";

            } else if (req.will_be_copied_frequently) {

                return "使用平凡可复制的结构体";

            } else {

                return "使用标准容器类模板";

            }

        }

        

        if (req.use_case == UseCase::BUSINESS_LOGIC) {

            if (req.requires_polymorphism) {

                return "使用抽象基类和具体派生类";

            } else if (req.needs_encapsulation) {

                return "使用具有私有成员的类";

            } else {

                return "使用结构体或简单类";

            }

        }

        

        if (req.use_case == UseCase::INTERFACE) {

            if (req.requires_polymorphism) {

                return


来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/19545/viewspace-3104378/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2015-11-01

  • 博文量
    895
  • 访问量
    933968