与循环迭代相比,内存分配的效率

时间:2014-06-16 19:23:11

标签: c arrays pointers utf-8

我在C中有一个函数,它将unicode代码点作为宽字符,并返回一个指向宽字符的UTF8格式的无符号字符数组的指针。然后我有另一个函数,它接受一个宽字符和一个指向数组的指针,并将宽字符的UTF8等价物插入到数组中(使用前一个函数将宽字符转换为多字节字符)。 我的问题是,由于后一个函数不知道返回的UTF8数组的长度(多字节字符),让前一个函数返回数组的长度更有意义,并将一个数组赋给一个预先声明的unsigned char指针作为参数传递?

char_u *wchar_to_mbchar(wchar_t *wChar)
{
    /* WARNING - NO NULL DELIM */

    char_u* mbChar;

    if(*wChar < 128) /* 1 byte chars */
    {
        mbChar = malloc(sizeof(char_u);

        *mbChar = *wChar; /* Is this okay?? */
    }
    else if(*wChar < 2048) /* 2 byte chars */
    {
        mbChar = malloc(2*sizeof(char_u));

        mbChar[0] = 192 + (*wChar >> 6);
        mbChar[1] = 128 + (*wChar - ((*wChar >> 6) << 6));
    }
    else if(*wChar < 65536) /* 3 byte chars */
    {
        mbChar = malloc(3*sizeof(char_u));

        mbChar[0] = 224 + (*wChar >> 12);
        mbChar[1] = 128 + ((*wChar - ((*wChar >> 12) << 12)) >> 6);
        mbChar[2] = 128 + (*wChar - ((*wChar >> 6) << 6));
    }
    else if(*wChar < 2097152) /* 4 byte chars */
    {
        mbChar = malloc(4*sizeof(char_u));

        mbChar[0] = 240 + (*wChar >> 18);
        mbChar[1] = 128 + ((*wChar - ((*wChar >> 18) << 18)) >> 12);
        mbChar[2] = 128 + ((*wChar - ((*wChar >> 12) << 12)) >> 6);
        mbChar[3] = 128 + (*wChar - ((*wChar >> 6) << 6));
    }
    return mbChar;
}

/* array, input wchar, char at */
int insert_mb_char(char_u* array,wchar_t* input,int insertAt) 
{
    char_u *mbChar;
    mbChar = wchar_to_mbchar(input);

    int i;
    for(i = 0; i < /*don't know how much to copy*/; i++)
        array[insertAt + i] = mbChar[i];

    return 0;
}

或者最好在第一个函数返回的数组末尾插入空分隔符,并简单地遍历它们? 我想这对代码性能几乎没有影响,但我只是想我会问。

另外,我知道我不应该,但是快速提问 - 最好是取消引用指针并为其指向的位置赋值,或者将新值的地址赋给指针(假设是新的)价值已经存在)?

1 个答案:

答案 0 :(得分:1)

由于你列出的原因,以及你没有列出的其他原因:让函数返回数组的长度更有意义,并将数组赋值给作为参数传递的预先声明的unsigned char指针。

这里的主要原因是,与malloc的单次调用相比,复制1-4个字节要快得多,并且不易出错。