LINUX.ORG.RU

Сообщения unsigned

 

[vim] Копирование в командную строку

Форум — General

Можно ли скопировать выделенный текст в командную строку vim?

Например, если искать текст во всех файлах, приходится набирать его после :grep, должен быть способ проще.

 

unsigned
()

[C] Полиморфные тормоза

Форум — Development

Есть абстрактный тип:

typedef int (*FruitID)(Fruit);
 
typedef struct _Fruit {
    int type;
    FruitID id;
} *Fruit;
и его реализация:
typedef struct _Apple {
    struct _Fruit base;
} *Apple;
 
int apple_id(Apple a)
{
    return 1;
}
 
Apple apple_new(void)
{
    Apple a = (Apple)malloc(sizeof(struct _Apple));
    a->base.type = 1;
    a->base.id = (FruitID)apple_id;
    return a;
}
Теперь добираюсь до поля объекта абстрактного типа двумя методами - «честный» полиморфизм и кондовый switch:
int fruit_id_virt(Fruit f)
{
    return f->id(f);
}
 
int fruit_id_nonvirt(Fruit f)
{
    switch(f->type) {
        case 1:
            return apple_id((Apple)f);
        case 2:
            return orange_id((Orange)f);
    }
    return 0;
}
и провожу замеры времени:
Fruit a = (Fruit)apple_new();
Fruit o = (Fruit)orange_new();
for(i = 0; i != 0xFFFFFFF; ++i)
#ifdef VIRT
  sum += fruit_id_virt(a) + fruit_id_virt(o);
#else
  sum += fruit_id_nonvirt(a) + fruit_id_nonvirt(o);
#endif
с помощью time(1). Грубо, конечно, но результат очевиден:

с fruit_id_virt: 0m9.644s

c fruit_id_nonvirt: 0m4.849s

ЧЯДНТ, отчего такое падение скорости? Как вызов по указателю может быть медленнее цепочки сравнений? Я уже хотел немного избавиться от if/switch в своем коде (как-то и эстетичнее оно), а тут такое...

 

unsigned
()

[autotools] Нужен ли libtool?

Форум — Development

Пишу библиотеку, использую automake. Вместе с ним настоятельно рекомендуют использовать libtool, но мне эта вещь совсем не понравилась. Есть ли причины пользоваться ей в 2010 году?

Кажется, все, что дает libtool - это поддержка всех существующих платформ, из которых большинство уже умерло, а оставшиеся пришли к более-менее единому стандарту. По крайней мере, на linux и *BSD сборка делается одной и той же командой.

А если отказаться от libtool, то как быть с automake? Достаточно ли добавить в Makefile.am

libmx.so       : expr.c var.c func.c module.c list.c
    $(CC) -I.. -fpic -shared -o $@ $^
? Это кроссплатформенно (для живых систем)?

(Вопрос только по autotools, предполагается, что они нужны ))

 

unsigned
()

[C] конструктор в архиве

Форум — Development

Имеется архив с функцией-конструктором, вызываемой перед main.

void init() __attribute__((constructor));
Линкую с основной программой - функция не вызывается (и ее нет в бинарнике).

Если вызвать ее явно, то вызовется также и перед main.

Если линковать с объектным файлом, то тоже все нормально.

Как вытащить init из архива без явного вызова?

 

unsigned
()

[C] Нулевые переменные

Форум — Development

Глобальные переменные по умолчанию инициализируются нулем, т. е. объявления

int i;
int j = 0;
равносильны. Почему тогда gcc генерирует разный код для них?
    .bss
j:
    .zero 4
.comm i, 4, 4
В описании .comm ничего не сказано об инициализации нулем.

 

unsigned
()

Удаленный запуск программы

Форум — Development

На сервере есть программка, которая должна запускаться по запросу клиента, делать нужное действие и сразу завершаться. Обмена данными на этом уровне можно избежать. Как лучше реализовать такое, не писать же собственный сервер?

unsigned
()

RSS подписка на новые темы