Что, если функция должна возвращать 2 значения?

Тема в разделе "WASM.BEGINNERS", создана пользователем Luna, 3 май 2010.

  1. GoldFinch

    GoldFinch New Member

    Публикаций:
    0
    Регистрация:
    29 мар 2008
    Сообщения:
    1.775
    JhanGhuangxi
    такого ключевого слова нет
    Код (Text):
    1. #define __out
     
  2. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    А вообще по-моему мыщъх не понял. Луне нужно вернуть указатели на массивы, а не координаты.
     
  3. kaspersky

    kaspersky New Member

    Публикаций:
    0
    Регистрация:
    18 май 2004
    Сообщения:
    3.006
    persicum
    > Великий хацкер ничего не путает?
    > Указатели вроде должны быть быстрее всего, поскоку сам объект не дублируется в стык.
    курим стандарт. и спрашиваем себя сколько будет выполняться цикл вида:

    foo(int *n)
    {
    int a, sym;
    for (a = 0, sym = 0; a < *n; a++) sym++;
    return sym;
    }

    сравниваем это с:
    foo(int *n)
    {
    int a, t, sym;
    for (a = 0, sym = 0, t = *n; a < t; a++) sym++;
    return sym;
    }

    думаем :)

    а еще думаем как будет выглядеть ссылка на регистр. и делаем вывод, что указатели рубят оптимизацию на хрен. и потому упаковка значений в int зачастую оправдывает себя. ну а так нужно смотреть по ситуации.
     
  4. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    kaspersky
    Так будет быстрее: sym = *n; ^)
     
  5. JhanGhuangxi

    JhanGhuangxi New Member

    Публикаций:
    0
    Регистрация:
    15 апр 2010
    Сообщения:
    31
    GoldFinch
    угумс, ступил
     
  6. diamond

    diamond New Member

    Публикаций:
    0
    Регистрация:
    21 май 2004
    Сообщения:
    507
    Адрес:
    Russia
    Стандарты надо не курить. Стандарты надо читать. Тогда, может быть, будет понятно, что на
    Код (Text):
    1. foo(int *n)
    2. {
    3. int a, sym;
    4. for (a = 0, sym = 0; a < *n; a++) sym++;
    5. return sym;
    6. }
    cl /c /O2 1.c && dumpbin /disasm 1.obj имеет полное право выдавать
    Код (Text):
    1. _foo:
    2.   00000000: 8B 44 24 04        mov         eax,dword ptr [esp+4]
    3.   00000004: 8B 00              mov         eax,dword ptr [eax]
    4.   00000006: 33 C9              xor         ecx,ecx
    5.   00000008: 85 C0              test        eax,eax
    6.   0000000A: 7F 02              jg          0000000E
    7.   0000000C: 8B C1              mov         eax,ecx
    8.   0000000E: C3                 ret
    что он, собственно, и делает.
    Надо полагать, имелось в виду что-то типа
    Код (Text):
    1. void foo(int *n, int* result)
    2. {
    3. int a;
    4. for (a = 0, *result = 0; a < *n; a++) ++*result;
    5. }
    в котором действительно получается цикл
    Код (Text):
    1. _foo:
    2.   00000000: 8B 4C 24 08        mov         ecx,dword ptr [esp+8]
    3.   00000004: 8B 54 24 04        mov         edx,dword ptr [esp+4]
    4.   00000008: 33 C0              xor         eax,eax
    5.   0000000A: 89 01              mov         dword ptr [ecx],eax
    6.   0000000C: 39 02              cmp         dword ptr [edx],eax
    7.   0000000E: 7E 07              jle         00000017
    8.   00000010: FF 01              inc         dword ptr [ecx]
    9.   00000012: 40                 inc         eax
    10.   00000013: 3B 02              cmp         eax,dword ptr [edx]
    11.   00000015: 7C F9              jl          00000010
    12.   00000017: C3                 ret
    но и в этом случае внимательное чтение стандарта вместо его курения обнаруживает ключевое слово __restrict
    Код (Text):
    1. void foo(int * __restrict n, int* __restrict result)
    2. {
    3. int a;
    4. for (a = 0, *result = 0; a < *n; a++) ++*result;
    5. }
    которое хорошо помогает оптимизатору:
    Код (Text):
    1.   00000000: 8B 44 24 04        mov         eax,dword ptr [esp+4]
    2.   00000004: 8B 00              mov         eax,dword ptr [eax]
    3.   00000006: 8B 4C 24 08        mov         ecx,dword ptr [esp+8]
    4.   0000000A: C7 01 00 00 00 00  mov         dword ptr [ecx],0
    5.   00000010: 85 C0              test        eax,eax
    6.   00000012: 7E 02              jle         00000016
    7.   00000014: 89 01              mov         dword ptr [ecx],eax
    8.   00000016: C3                 ret
     
  7. Phuntik

    Phuntik New Member

    Публикаций:
    0
    Регистрация:
    4 фев 2008
    Сообщения:
    318
    Вот не пойму, чего это так некоторые товарищи на мыщ'а озлоблены?
    Вроде он себя никогда не позиционировал как величайшего хакера.
    Простите, ТС, наболело.
    И да, это не вброс.
     
  8. Ustus

    Ustus New Member

    Публикаций:
    0
    Регистрация:
    8 авг 2005
    Сообщения:
    834
    Адрес:
    Харьков
    diamond
    Ну, __restrict не очень-то и стандарт...
     
  9. diamond

    diamond New Member

    Публикаций:
    0
    Регистрация:
    21 май 2004
    Сообщения:
    507
    Адрес:
    Russia
    Ustus
    Стандарт ISO/IEC 9899:1999 aka C99. Раздел 6.7.3 "Type qualifiers". Пункт 7:
    Ну и, соответственно, весь подраздел 6.7.3.1 этому посвящён.