gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 15:32:25 24 4
gpt4 key购买 nike

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

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;
}

或者在第一个函数返回的数组末尾插入空分隔符并简单地迭代它们会更好吗?我想这对代码性能几乎不会产生影响,但我只是想问一下。

另外,我知道我不应该,但快速问一个问题 - 取消引用指针并将值分配给它指向的位置,或者将新值的地址分配给指针(假设新值)是否更好?值已经存在)?

最佳答案

出于您已列出的原因以及您未列出的其他原因:让函数返回数组的长度并将该数组分配给作为参数传递的预先声明的 unsigned char 指针会更有意义。

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

关于c - 与循环迭代相比的内存分配效率,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24250712/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com