【cpp/c++ summary 语法总结】指定初始化 designated initializer ObjName[COUNT]={[1]=1,[INDEX]=2}

  • 指定初始化器(designated initializer) 是 C 语言和 C++ 中的一种特性,允许在初始化结构体或数组时显式指定某个成员或元素的名称和初始值,而不是按顺序提供所有值。
1. 初始化结构体
  • 可以使用指定初始化器来初始化结构体的特定成员,而不必按顺序传递所有字段的值。
struct Point {
    int x;
    int y;
};

struct Point p1 = { .x = 1, .y = 2 };  // .{成员名} = 值 指定初始化器

在这段代码中,GGML_TYPE_F32 并不是一个变量,而是一个 枚举值常量,通常是一个用来表示数据类型的标识符。

2. 初始化数组
int arr[5] = { [0] = 10, [3] = 20 };  // 指定初始化器
  • 数组 arr 的第 0 个元素被初始化为 10,第 3 个元素被初始化为 20,其余元素将被默认初始化为 0。
3. 结构体数组初始化
struct Point points[3] = {
    [0] = { .x = 1, .y = 2 },
    [1] = { .x = 3, .y = 4 },
    [2] = { .x = 5, .y = 6 }
};
  • 实际示例:
static const struct ggml_type_traits_cpu type_traits_cpu[GGML_TYPE_COUNT] = {
    [GGML_TYPE_F32] = {
        .vec_dot = (ggml_vec_dot_t) ggml_vec_dot_f32,
        .vec_dot_type = GGML_TYPE_F32,
        .nrows = 1,
    },
    [GGML_TYPE_F16] = {
        .from_float = (ggml_from_float_t) ggml_fp32_to_fp16_row,
        .vec_dot = (ggml_vec_dot_t) ggml_vec_dot_f16,
        .vec_dot_type = GGML_TYPE_F16,
        .nrows = 1,
    },
    // 其他类型...
};
  • GGML_TYPE_COUNT为确定值。

  • 以上代码中 GGML_TYPE_F32 是常量

     //  https://github1s.com/ggerganov/ggml/blob/master/include/ggml.h#L354-L396 NOTE: always add types at the end of the enum to keep backward compatibility
     enum ggml_type {
         GGML_TYPE_F32     = 0,
         GGML_TYPE_F16     = 1,
         GGML_TYPE_Q4_0    = 2,
         GGML_TYPE_Q4_1    = 3,
         // GGML_TYPE_Q4_2 = 4, support has been removed
         // GGML_TYPE_Q4_3 = 5, support has been removed
         GGML_TYPE_Q5_0    = 6,
         GGML_TYPE_Q5_1    = 7,
         GGML_TYPE_Q8_0    = 8,
         GGML_TYPE_Q8_1    = 9,
         GGML_TYPE_Q2_K    = 10,
         GGML_TYPE_Q3_K    = 11,
         GGML_TYPE_Q4_K    = 12,
         GGML_TYPE_Q5_K    = 13,
         GGML_TYPE_Q6_K    = 14,
         GGML_TYPE_Q8_K    = 15,
         GGML_TYPE_IQ2_XXS = 16,
         GGML_TYPE_IQ2_XS  = 17,
         GGML_TYPE_IQ3_XXS = 18,
         GGML_TYPE_IQ1_S   = 19,
         GGML_TYPE_IQ4_NL  = 20,
         GGML_TYPE_IQ3_S   = 21,
         GGML_TYPE_IQ2_S   = 22,
         GGML_TYPE_IQ4_XS  = 23,
         GGML_TYPE_I8      = 24,
         GGML_TYPE_I16     = 25,
         GGML_TYPE_I32     = 26,
         GGML_TYPE_I64     = 27,
         GGML_TYPE_F64     = 28,
         GGML_TYPE_IQ1_M   = 29,
         GGML_TYPE_BF16    = 30,
         GGML_TYPE_Q4_0_4_4 = 31,
         GGML_TYPE_Q4_0_4_8 = 32,
         GGML_TYPE_Q4_0_8_8 = 33,
         GGML_TYPE_TQ1_0   = 34,
         GGML_TYPE_TQ2_0   = 35,
         GGML_TYPE_IQ4_NL_4_4 = 36,
         // GGML_TYPE_IQ4_NL_4_8 = 37,
         // GGML_TYPE_IQ4_NL_8_8 = 38,
         GGML_TYPE_COUNT,
     };
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值