Как обрабатывать распределение строк в выходной структуре - PullRequest
0 голосов
/ 05 мая 2009

Каков наилучший способ обработки выходной структуры с некоторыми строками в ней?

struct info 
{ 
wchar_t * text; 
size_t text_len; 
}

void Foo(struct info * output);
  • Пользователь должен выделять текст сам

    вывод может быть переработан в цикле
    трудно понять, сколько памяти должно быть выделено, возможная трата памяти при сохранении вывода (например, ведение списка элементов)

  • выделить текст в Foo

    боль для пользователя, чтобы освободить вывод, так как он должен освободить каждый текст раньше (может сделать FreeStructInfo, чтобы облегчить боль)
    не очень хорошо в циклах

  • выделить вывод из Foo

    Foo может встраивать текст в структурную информацию, и пользователю требуется только свободный вывод для освобождения всех.
    хорошо для хранения (Foo знает, сколько ему нужно выделить),
    но, возможно, большое напряжение памяти, если она используется в качестве кратковременной переменной в цикле, поскольку она не может быть переработана.

Windows использует «Пользователь должен выделять текст сам», и либо вы выделяете достаточно, либо вам нужно дважды вызвать функцию, чтобы получить необходимый размер.

Ответы [ 3 ]

3 голосов
/ 05 мая 2009

Нет лучшего способа - все варианты, которые вы предлагаете, используются в тот или иной момент. Важно хорошо документировать это и поддерживать его согласованным для всех функций в библиотеке, где это практически возможно.

1 голос
/ 05 мая 2009

Вы можете использовать первую идиому (пользователь выделяет), и если места для строки недостаточно, вы перераспределяете. Это будет работать, если вы и пользователь соглашаетесь использовать одно и то же распределение (например, malloc / free). Это даст вам оптимальную производительность (без распределения для каждой итерации) и все еще удобно для пользователя.

С этой идиомой выделенное хранилище увеличивается по мере необходимости, но пользователь может в любое время выбрать «сокращение» его путем перераспределения меньшего хранилища (которое при необходимости начнет расти снова).

0 голосов
/ 05 мая 2009

Лотар довольно неплохо суммировал преимущества для первой идиомы - вполне вероятно, что это лучший вариант для общих решений.

Однако бывают случаи, когда третий вариант (модифицированный) лучше - если у вас есть что вывести. Чтобы избежать стресса памяти, вы можете добавить пулы в смесь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...