LINUX.ORG.RU

Int в Hex, ускорить и укоротить

 ,


1

2

Можно ли заоптимизировать эту функцию?

char * intToHex(int32_t value, uint32_t up, uint32_t pre, uint32_t msize)
{
    const char * hexdigit[2] = {"0123456789abcdef",
                                "0123456789ABCDEF"};

    union itou
    {
        int32_t  i;
        uint32_t u;
    };

    union itou conv;
    conv.i = value;

    uint32_t pos = 0;
    char * result;
                                    /* 0x    FF FF FF FF         \0 */
    if (!(result = malloc(sign(pre) * 2 + sizeof(uint32_t) * 2 + 1)))
        return 0;

    if (pre)
    {
        strcpy(result, "0x");
        pos = 2;
    }

    while (1UL << (msize * 4) > conv.u)
    {
        result[pos++] = '0';
        msize--;
    }

    while (conv.u != 0)
    {
        result[pos++] = hexdigit[sign(up)][conv.u & 0xF];
        conv.u >>= 4;
    }

    result[pos] = '\0';

    return result;
}

★★

Последнее исправление: cetjs2 (всего исправлений: 1)
Ответ на: комментарий от anonymous

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

В любом случае, такой подход правилен. А не то, что сейчас, когда всякое говно, вроде хромого, отхавает виртуальных 10ГБ и счастливенькое себе тормозит, пока его oom-killer не грохнет!

Ну, а уродов вроде создателей хромого надо за яйца на столбы ЛЭП подвешивать в качестве новогодних украшений.

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от Eddy_Em

Я не понимаю, почему Линус до сих пор не провел политику улучшения методов выделения памяти в ядре!

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от Dark_SavanT

Суть не в том, что что-то говно. Суть в том, чтоб юзать меньшее говно и если есть возможно жрать меньше говна - надо жрать меньше.

А не как обезьяны вещаю «сожри говно со всего света - это же так модно сейчас». Ты шьёшь одежду? Нахрен нужны размеры - она должна быть универсально. И похрен что ты ваяешь бесполезное говно - натянуть-то можно на любого.

Так же и тут. Что отличает илитного портного от обезьяны? Илитный портной может сшить и подогнать что-то истинно по тебя. А обезьяна даже алкашку 80-го размера не сошьёт. Для ваяния алкашок скилл, возможности, руки не нужны - они нужны для подгонки.

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

anonymous
()
Ответ на: комментарий от Dark_SavanT

malloc в микроконтроллерах? И каким [censored] здесь линукс?

Давай, я для STM32 напишу свою псевдо-RTOS, и ты будешь гадать, что же там делает функция malloc...

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от Eddy_Em

Яб тебе не советовал рассказывать мне что-то и спорить со мною.

Потомучто ты рак. Ты молодец, что хоть что-то начал понимать(вернее запомнил мои споры), но ты слишком днище чтобы понять почему и зачем это существует.

Слишком сложно нулёвому перевести своё видение из мира анскила где есть какая-то общая примитивная прямая память на модель текущей памяти. Обезьяна пытается свести vmem просто к оперативе лишь по своей отсталости и глупости.

anonymous
()

Удалённый анонимус по большей части был прав.

Deleted
()
Ответ на: комментарий от Eddy_Em

Ещё раз. На целевой машине может не оказаться достаточно памяти, и для программиста на си непозволительное рукожопие считать иначе. Твои фокусы с overcommit memory никому не интересны.

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <malloc.h>
#include <errno.h>
#include <unistd.h>

int main(int argc, char **argv)
{
    size_t sz=(1024*1024*1024)*1lu;
    do {
        void *zz=malloc(sz);
        if (!zz)
            if (ENOMEM==errno) {
                fprintf(stderr, "hello ENOMEM\n");
                perror("fail");
                //abort();
                _exit(EXIT_FAILURE);
            }
        memset(zz,1,sz);
        malloc_stats();} while(1);
    getchar();
    return 0;
}

wakuwaku ★★★★
()
Ответ на: комментарий от wakuwaku

На целевой машине может не оказаться достаточно памяти

Из-за того, что линуксовое ядро дырявое, malloc все равно не вернет NULL!

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от Dark_SavanT

В МК все честно и красиво. Никакого говна.

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от sambist

для либы эта функа кривой интерфейс.

msize есть ведь в «некоторой зависимости » от остальных аргументов не?

т.е msize не есть ортогонально .

qulinxao ★★☆
()
Ответ на: комментарий от anonymous

Иди инты складывай, кукаретик.

anonymous
()
Ответ на: комментарий от sambist

зачем ты вообще считаешь sizeof

если int32 по определению будет тебе давать 8символов.

а если ты дашь чутка большый msize то будеш писать мимо выделенной памяти :)

qulinxao ★★☆
()
Ответ на: комментарий от qulinxao

зачем ты вообще считаешь sizeof

Чтобы не думать, с хренали здесь 8.

а если ты дашь чутка большый msize то будеш писать мимо выделенной памяти :)

См. предыдущее сообщение. И вообще там проверка стоит if > 8, =8.

sambist ★★
() автор топика
Ответ на: комментарий от qulinxao

Еще раз - там проверка на >8, пройди по треду, я выкладывал патч.

sambist ★★
() автор топика
Ответ на: комментарий от qulinxao

Нахрен он мне нужен? Если понадобится — поменяю направление цикла. Делов-то!

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от sambist

как тебе уже намекали

выражение содержащие sizeof(int32_t) можно указать в объявлении локального буфера в который результат будет стрИмится.

а память(куда ответ будет перед возвратом скопирован) всё таки вызыватель пусть выдаёт.

если уж экономить память то аргументом для маллока может быть выражение из:

Уоррен Алгоритмические ...

qulinxao ★★☆
()

в результате после всех патчей

какой диапазон значений msize влияет на результат в зависимости от value?

qulinxao ★★☆
()
Ответ на: комментарий от qulinxao

В том, что пользователю часто нужно выравнивание, а

0x0FBA // msize = 4
0x0001
0x200B

Выглядит лучше, чем

0xFBA
0x1
0x200B

sambist ★★
() автор топика
Ответ на: комментарий от sambist

однако если пользователь закажет выравнивание msize =12 , реализация ненавязчиво укажет как лучше. большой брат лучше знает что тебе нужно %username%. Замечательно

qulinxao ★★☆
()
Ответ на: комментарий от Eddy_Em

Искусственный бред.

Этого достаточно для опровержения вашего перла «нет смысла проверять результат malloc: он никогда не вернет NULL».

Sorcerer ★★★★★
()
Ответ на: комментарий от sambist

дык у тебя перемешано

почему для случая value=1 ширина может быть от 1 до 8 но не может быть 9?

абстракции текут.

qulinxao ★★☆
()
Ответ на: комментарий от Sorcerer

Еще раз: почитай, что царь говорил. Очень даже верно все. Учитывая то, что линуксовое ведро больше похоже на друшлаг, все верно!

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от qulinxao

Это — общее название.

Но как по мне, так ты либо таки китаец (не зря же Кулиньксяо обозвался!), либо каменный великан

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от int13h

В Чернобыле просто писали коньдидатский диссер с предположением "а вдруг не [censored]т?"

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от qulinxao

Если кан поет, это одно из двух: либо ты просрал еду на всю группу, либо забыл туда еду для изготовки загрузить...

Eddy_Em ☆☆☆☆☆
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.