Перенос комментариев в ответ, поскольку больше никто не вмешивается.
Почему бы не использовать (двухсвязный) список строк, где каждый элемент списка является строкой, чтобы вы могли вызывать printw()
один раз для каждой строки, как с массивами? Вы также значительно сократите требования к хранилищу; на 64-битной машине двусвязный список из одиночных символов, вероятно, будет использовать 24 байта на символ, что является довольно большим накладным расходом.
Я на самом деле только начал это делать. Это кажется довольно приличным компромиссом (у меня есть подозрение, что это то, что использует nano). Я, вероятно, удалю этот вопрос, потому что думаю, что это мое решение, с которым я буду работать. Кроме того, не стоит ли использовать realloc()
при каждой вставке/удалении?
Я бы, вероятно, разработал узлы списка в соответствии со строками:
struct Line
{
struct Line *next;
struct Line *prev;
char *line;
size_t line_len;
size_t line_max;
};
где line_len
записывается текущая длина строки, а line_max
записывается выделенное пространство.
Я бы не стал вызывать realloc()
, когда персонаж был удален; Я бы, вероятно, не стал этого делать, если бы не было довольно большого (256 байт?) несоответствия между фактическим и максимальным размером.
Для вставок я бы перераспределял только тогда, когда места больше не было (когда line_len == line_max
, но остерегайтесь по одному), и я бы выделял с шагом не менее 16 символов (потому что это, вероятно, минимальное количество, которое malloc()
и др. на самом деле все равно выделять, плюс когда пользователь вставляет один символ, он часто вставляет несколько). Итак, вы хотите избежать посимвольных изменений в распределении памяти (вызовы realloc()
), не опасаясь перераспределения при необходимости.
person
Jonathan Leffler
schedule
19.06.2013
printw
только один раз для каждой строки, а не для каждого символа (в списке). Кроме того, массивы также могут изменять размер, и они не обязательно должны иметь одинаковые размеры. Я не совсем уверен, что вы имели в виду. - person tay10r   schedule 19.06.2013printw()
один раз для каждой строки, как с массивами. Вы также значительно сократите требования к хранилищу; на 64-битной машине двусвязный список из одиночных символов, вероятно, будет использовать 24 байта на символ, что является довольно большим накладным расходом. - person Jonathan Leffler   schedule 19.06.2013nano
). Я, вероятно, удалю этот вопрос, потому что думаю, что это мое решение, с которым я буду работать. Кроме того, не стоит ли использоватьrealloc
при каждой вставке/удалении? - person tay10r   schedule 19.06.2013struct Line { struct Line *next; struct Line *prev; char *line; size_t line_len; size_t line_max; };
, гдеline_len
записывает текущую длину строки, аline_max
записывает выделенное пространство. Я бы не стал вызыватьrealloc()
, когда персонаж был удален; Я бы, вероятно, не стал этого делать, если бы не было довольно большого (256 байт?) несоответствия между фактическим и максимальным размером. [...продолжение...] - person Jonathan Leffler   schedule 19.06.2013line_len == line_max
, но остерегайтесь по одному), и я бы выделял с шагом не менее 16 символов (потому что это, вероятно, минимальное количество, котороеmalloc()
и др. фактически выделяют в любом случае, плюс, когда пользователь вставляет один символ, они часто вставляют несколько). Итак, вы хотите избежать посимвольных изменений в распределении памяти (вызовыrealloc()
), не опасаясь перераспределения при необходимости. - person Jonathan Leffler   schedule 19.06.201316
байт за раз - person tay10r   schedule 19.06.2013