275  Naik [Off]
(14.02.2017 / 21:54)
Витаминыч, 0 :gg:
3062  Витаминыч (Smd) [Off]
 わからない!!
(14.02.2017 / 21:43)
kalterfx, так сколько спичек экономим в итоге? :dum:
4468  kalterfx [Off]
 Homo homini penis est.
(14.02.2017 / 19:14)
Это очень простая оптимизация, чтобы с ней не справился компилятор. Размер массива известен на момент компиляции → все sizeof, связанные с данными этого массива, заменяются на числа (в отличии от VLA, я предполагаю); по этой же причине адрес за &arr (это (&arr)[1] ) тоже известен → (&arr)[1] - arr компилятор тоже может заменить на число.
Изм. kalterfx (14.02 / 19:14) (1)
107  Ginosaji [Off]
(14.02.2017 / 19:10)
DominaN, не знаю
2262  DominaN [Off]
(14.02.2017 / 18:19)
Ginosaji, а MSVC?
107  Ginosaji [Off]
(14.02.2017 / 10:29)
Делал замер скорости двух подходов?Для gcc нечего замерять, он генерирует одинаковый ассемблерный код.
  1. main.c
  2.   1 #include <stdio.h>                                                                                                                                                                                            
  3.  2                                                                                
  4.   3 int main(int argc, char **argv)                                                
  5.   4 {                                                                              
  6.   5         int arr[10];                                                            
  7.   6         int size = sizeof(arr)/sizeof(arr[0]);                                  
  8.   7         printf("%d\n", size);                                                  
  9.   8         return 0;                                                              
  10.   9 }
  11.  
  12. trick.c
  13.  
  14.   1 #include <stdio.h>                                                                                                                                                                                            
  15.  2                                                                                
  16.   3 int main(int argc, char **argv)                                                
  17.   4 {                                                                              
  18.   5         int arr[10];                                                            
  19.   6         int size = (&arr)[1] - arr;                                            
  20.   7         printf("%d\n", size);                                                  
  21.   8         return 0;                                                              
  22.   9 }  
  23.  
  24. $ gcc main.c
  25. $ ./a.out
  26. 10
  27. $ gcc trick.c
  28. $ ./a.out
  29. 10
  30. Теперь смотрим ассемблерный код
  31.  
  32. $ gcc -S main.c
  33. $ gcc -S trick.c
  34. $ diff main.s trick.s
  35. 1c1
  36. <   .file   "main.c"
  37. ---
  38. >   .file   "trick.c"
3789  vl@volk [Off]
 знает толк
(14.02.2017 / 09:50)
Это конечно не самое универсальное, но эффективное решение. Делал замер скорости двух подходов?
4468  kalterfx [Off]
 Homo homini penis est.
(14.02.2017 / 04:47)
Окей

  1. #define ARRAY_SIZE(x) ( (&x)[1] - x )
2262  DominaN [Off]
(13.02.2017 / 22:47)
Макрос бы оформить
Всего: 9
К записи
Прочие языки
Категории

Мы в соцсетях

tw tg yt gt