Реализация алгоритма itoa10
Вот сам алгоритм:
C get_digit_char( int i )
{
static const C chars[19] =
{
'9', '8', '7', '6', '5', '4', '3', '2', '1',
'0',
'1', '2', '3', '4', '5', '6', '7', '8', '9'
};
static C const* mid = chars + 9;
return mid;
}
template <typename C>
C const* itoa10( int num, C* buffer, size_t bufSize )
{
C* pos = buffer + bufSize - 1;
*pos = 0;
int isign = num < 0;
do
{
int t = num % 10;
num /= 10;
--pos;
*pos = get_digit_char<C>( t );
}
while( num != 0 );
if ( isign )
{
--pos;
*pos = '-';
}
return pos;
}
[/FONT]
размер буффера ? это снижает удобство функции.
Есть один мудрый закон (вообще по жизни, а не только в программировании):
Больше универсальность - больше проблем и меньше мест приложения.
4 Darien.
1) вторая функция пользователю не мешает, он ее не видит, но она кое-что дает;
2) метод " a + '0' " не будет работать для wchar_t;
3) это не кэширование, а индексация, которая, действительно, не прибавляет производительности, а решает другую задачу: отсутствие обратной перестановки цифр после деления на 10 (попробуй реализовать этот алгоритм сам, поймешь зачем);
4) Причем здесь класс я не понял, шаблон ориентирован только на 2 типа: char и wchar_t, как в таких случаях часто и бывает;
5) указание размера буфера позволяет применить указанную ранее оптимизацию, к тому же это соответствует стандарту безопастности по проверке длины передаваемого буфера.
4 .nornad
Стандартная функция медленнее примерно раза в 2 (MSVC 2005), так как поддерживает произвольный radix, а эта оптимизирована на 10. Стандартные функции не всегда оптимальны, почитай "Практику программирования" Кернигана.
4 Zorkus
Это нужно для приложения, к котором это функция вызывается очень часто. Не скажу, что это убедительный аргумент :), но превосходство по быстродействию все же имеет значение.
4 Zorkus
Это нужно для приложения, к котором это функция вызывается очень часто. Не скажу, что это убедительный аргумент :), но превосходство по быстродействию все же имеет значение.
Я понимаю, это может быть коммерческой тайной. Но все же, может расскажешь поподробней о приложении?
Но мне кажется, не суть важно, какая задача. Я понимаю, что первое правило оптимизации - не оптимизировать, но здесь необходимость оптимизации доказана.
//1) вторая функция пользователю не мешает, он ее не видит, но она кое-что дает;
Она программисту мешает.
//2) метод " a + '0' " не будет работать для wchar_t;
С утра работал.
//3) это не кэширование, а индексация, которая, действительно, не //прибавляет производительности, а решает другую задачу: отсутствие //обратной перестановки цифр после деления на 10 (попробуй //реализовать этот алгоритм сам, поймешь зачем);
Кэширование есть запоминание, с возможностью конкретного спецефического доступа. прежде чем спорить, изучите термины. Такие алгоритмы я в школе писал, о каком обратном порядке цифр идёт речь я понятия не имею, чушь какая-то.
//4) Причем здесь класс я не понял, шаблон ориентирован только на 2 //типа: char и wchar_t, как в таких случаях часто и бывает;
Ваш шаблон ориетирован на любой указатель. "А причём тут класс" - объясняю: если подать туда std::string , то работать не будет очевидно, поэтому функция не универсальна.
Отвратительно!
1. С++ здесь нет, если не считать совершенно ненужного шаблона.
2. Функция get_digit_char совершенно не нужна. Проще и быстрее привести исходное число к абсолютному значению и далее для цифр использовать n+'0'. Это работает как для char, так и для wchar_t.
3. Когда я передаю буфер в функцию, я жду что он будет заполнен от начала, а не от середины.
Я понимаю, что первое правило оптимизации - не оптимизировать, но здесь необходимость оптимизации доказана.
Приведи доказательство. Сомневаюсь, что это самая токнкая часть всей системы. Так жен сомневаюсь, что стандартный itoa в два раза медленнее. И уж совсем не согласен, что из-за radix.
Я никакаой проверки не виду) Там прямое переполнение)
[QUOTE=noid]Это приложение предназначено для работы с большой базой данных на XML, содержащей много полей с числовыми данными и параметрами. Соотвественно, данные надо парсить и преобразовывать в числовой формат. [/QUOTE]
Ф. преобразует число в "данные"??? Ты нечего не путаешь?
А вот с реализацией ф. C get_digit_char( int i ) впоне согласен, нельзя привязываться в кодировке), нужно четко назначить числу его символьное представление).
З.Ы. А шаблоны как-то лишне выгледят
А вот с реализацией ф. C get_digit_char( int i ) впоне согласен, нельзя привязываться в кодировке), нужно четко назначить числу его символьное представление).
[/QUOTE]
Почему это нельзя? Конкретное документальное подтверждение, пожалуйста.
Более того, ты согласен, что вместо абсолютного значения надо использовать массив двойного размера?
Для цифр во всех кодировках есть правило
А вот для букв точно привязываться нельзя, так как о порядке их слевования нет никакой инфы)
И усё)
Я поторопился, подумав, что для цифр тоже самое.