The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]



Вариант для распечатки  
Пред. тема | След. тема 
Форум Разговоры, обсуждение новостей
Режим отображения отдельной подветви беседы [ Отслеживать ]

Оглавление

Релиз Chrome 80, opennews (?), 05-Фев-20, (0) [смотреть все]

Сообщения [Сортировка по времени | RSS]


26. "Релиз Chrome 80"  +6 +/
Сообщение от Аноним84701 (ok), 05-Фев-20, 15:46 
> ну вот они любители многомерных массивов char[16][16][16] будет на 90% дешевле если
> написать char[16*16*16] и расчитывать по формуле z*256+y*16+x что и дает замедление в 8%-10%

Стесняюсь спросить - а по какой формуле у вас доступ к "оригинальному" char[x][y][z]? o_O

Ответить | Правка | К родителю #2 | Наверх | Cообщить модератору

31. "Релиз Chrome 80"  –3 +/
Сообщение от Знаток (?), 05-Фев-20, 16:05 
Хорошо что боишься, потому что "оригинал" расчитываеться не по формуле а по таблице указателей
Ответить | Правка | Наверх | Cообщить модератору

40. "Релиз Chrome 80"  +5 +/
Сообщение от Аноним84701 (ok), 05-Фев-20, 16:29 
>  Знаток
> Хорошо что боишься, потому что "оригинал" расчитываеться не по формуле а по таблице указателей

Хм *смотрит на ник - какой хороший, годный и подходящий для опеннета! И вздыхает: как хорошо, что все таки никто не начал объяснять, на кой черт там сдались таблицы указателей и почему компиляторы об этом не слышали*


% cat arr2.c &&  gcc -S -O2 -m32 -masm=intel -fverbose-asm arr2.c && more arr2.s
int* foo(int x, int y, int z, int val) {
    static int bar [10][10][10] = {0};
    bar[x][y][z] = val;
    return bar;
}

foo:
.LFB0:
        .cfi_startproc
# arr2.c:1: int* foo(int x, int y, int z, int val) {
        mov     eax, DWORD PTR [esp+8]  # y, y
# arr2.c:3:     bar[x][y][z] = val;
        lea     edx, [eax+eax*4]        # tmp90,
        imul    eax, DWORD PTR [esp+4], 100     # tmp92, x,
        lea     eax, [eax+edx*2]        # tmp93,
        mov     edx, DWORD PTR [esp+16] # val, val
        add     eax, DWORD PTR [esp+12] # tmp94, z
        mov     DWORD PTR bar.1848[0+eax*4], edx        # bar, val
# arr2.c:5: }
        mov     eax, OFFSET FLAT:bar.1848       #,
        ret    
        .cfi_endproc


Ответить | Правка | Наверх | Cообщить модератору

46. "Релиз Chrome 80"  –11 +/
Сообщение от Уважаемыый (?), 05-Фев-20, 16:44 
Как научишься создавать многомерный массив на куче, а не на стеке, приходи поговорим
Ответить | Правка | Наверх | Cообщить модератору

86. "Релиз Chrome 80"  +3 +/
Сообщение от Аноним84701 (ok), 05-Фев-20, 20:37 
Гм-хм, вы слишком переоцениваете "откровение" из детского мультика: "Как вы яхту назовете ...".

> Как научишься создавать многомерный массив на куче, а не на стеке, приходи поговорим

Предпочту подождать с разговором, пока анонимный "Уважаемый", "Знаток", "Эксперт" (эпитет "Скромный" не упомянут видимо из скромности) не подучит матчасть 🙄


cat arr3.c &&  gcc -O2 arr3.c && ./a.out 2 2 1 1337
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define DIM 3
#define TYPE int

const size_t ARR_LEN = DIM * DIM * DIM ;
const size_t ARR_SIZE = ARR_LEN * sizeof(TYPE);

typedef TYPE array[DIM][DIM][DIM];
void foo(array bar, int x, int y, int z, char val) {
        bar[x][y][z] = val;
}

int main(int argc, char** argv) {
    array *arr = malloc(ARR_SIZE);
    for (size_t i = 0; i < ARR_LEN; i++) {
        *((TYPE*)arr + i) = atoi(argv[4]) + i;
        printf ("%p:%lu = %lu\n",((TYPE*)arr + i), i, atoi(argv[4]) + i);
    }
    foo(*arr, atoi(argv[1]), atoi(argv[2]), atoi(argv[3]), atoi(argv[4]) + 1);
    
    for (size_t x = 0; x < DIM; x++)
        for(size_t y = 0; y < DIM; y++)
            for(size_t z = 0; z < DIM; z++)
              printf("[%lu][%lu][%lu]: %d\n",  x,y,z, (*arr)[x][y][z]);

    return 0;
}
0x800a45000:0 = 1337
0x800a45004:1 = 1338
0x800a45008:2 = 1339
0x800a4500c:3 = 1340
...
0x800a45060:24 = 1361
0x800a45064:25 = 1362
0x800a45068:26 = 1363
[0][0][0]: 1337
[0][0][1]: 1338
[0][0][2]: 1339
..
[2][1][2]: 1360
[2][2][0]: 1361
[2][2][1]: 58
[2][2][2]: 1363


foo:
.LFB1:
        .cfi_startproc
# arr3.c:12: void foo(array bar, int x, int y, int z, char val) {
        mov     eax, DWORD PTR [esp+8]  # x, x
# arr3.c:13:         bar[x][y][z] = val;
        mov     ecx, DWORD PTR [esp+4]  #, bar
        mov     edx, DWORD PTR [esp+12] # y, y
        lea     eax, [eax+eax*8]        # tmp95,
        lea     eax, [ecx+eax*4]        # tmp97,
        movsx   ecx, BYTE PTR [esp+20]  # val, val
        lea     edx, [edx+edx*2]        # tmp100,
        add     edx, DWORD PTR [esp+16] # tmp101, z
        mov     DWORD PTR [eax+edx*4], ecx      # *_3, val
# arr3.c:14: }
        ret    
        .cfi_endproc

(это все помимо того, что абсолютно никто не мешает обернуть обращение к одномерному массиву в макрос и не париться - но … раз анонимы в книжке^W на стековерфлоу прочитали "нужно использовать массив указателей на указателей, иначе никак!", то так и будут, не задумываясь, их использовать 🙄)

И, чтобы начать немного соответствовать никам, не забудьте завернуть доказательства, что последовательная загрузка из _таблицы указателей_ :


void foo2(int*** bar, int x, int y, int z, char val) {
    bar[x][y][z]
}

foo2:
.LFB1:
        .cfi_startproc
# arr3.c:14:     bar[x][y][z] = val;
        movsx   rsi, esi        # x, tmp107
        movsx   rdx, edx        # y, tmp108
        movsx   rcx, ecx        # z, tmp109
        movsx   r8d, r8b        # val, tmp110
        mov     rax, QWORD PTR [rdi+rsi*8]      # *_3, *_3
        mov     rax, QWORD PTR [rax+rdx*8]      # *_7, *_7
        mov     DWORD PTR [rax+rcx*4], r8d      # *_11, val
# arr3.c:16: }
        ret    
        .cfi_endproc


будет быстрее вычисления адреса (особенно при размерах, кратных 2-м).
foo:
.LFB1:
        .cfi_startproc
# arr3.c:13:         bar[x][y][z] = val;
        movsx   rsi, esi        # x, tmp101
        movsx   rdx, edx        # y, tmp102
        movsx   rcx, ecx        # z, tmp103
        movsx   r8d, r8b        # val, tmp104
        sal     rsi, 10 # tmp93,
        sal     rdx, 4  # tmp97,
        add     rsi, rdi        # tmp94, tmp100
        add     rdx, rcx        # tmp98, z
        mov     DWORD PTR [rsi+rdx*4], r8d      # *_3, val
# arr3.c:14: }
        ret    
        .cfi_endproc

Ответить | Правка | Наверх | Cообщить модератору

94. "Релиз Chrome 80"  –4 +/
Сообщение от Риттчи (?), 05-Фев-20, 21:19 
Чем больше кода, тем меньше людей поймут, что ты тролль, и создаешь массив на стеке и присваешь его адрес указателю, молодец но меня не обманул.
Ответить | Правка | Наверх | Cообщить модератору

99. "Релиз Chrome 80"  +/
Сообщение от Аноним84701 (ok), 05-Фев-20, 22:14 
> Чем больше кода

Специально написал аж 27 строчек, думал аноним меня не раскусит :(

array *arr = malloc(ARR_SIZE);

>  создаешь массив на стеке

Аноним меня поймал! :(

> и присваешь его адрес указателю, молодец но меня не обманул.

Все еще с нетерпением ждем-с пруфов для
>>  и дает замедление в 8%-10%

(или внятного разъяснения, на кой черт там сдались указатели на указатели)

Ответить | Правка | Наверх | Cообщить модератору

122. "Релиз Chrome 80"  –1 +/
Сообщение от Аноним (122), 06-Фев-20, 09:01 
> #define DIM 3

Зачем ты придуриваешься? У тебя же фиксированного размера массив.

Ответить | Правка | Наверх | Cообщить модератору

136. "Релиз Chrome 80"  +/
Сообщение от Аноним84701 (ok), 06-Фев-20, 13:53 
>> #define DIM 3
> Зачем ты придуриваешься? У тебя же фиксированного размера массив.

Затем же, зачем ты не читаешь то, на что пишешь ответ?

>>> "оригинал" расчитываеться не по формуле а по таблице указателей
>> Как научишься создавать многомерный массив на куче, а не на стеке,
>  и создаешь массив на стеке и присваешь его адрес указателю

Где там было про дин. размер?
Возможно, вместо важного надувания щек анонимам нужно было просто более внятно выражать свои мысли?

Ответить | Правка | Наверх | Cообщить модератору

88. "Релиз Chrome 80"  +/
Сообщение от Аноним (88), 05-Фев-20, 20:47 
Нет там никакой таблицы указателей. a[][N] — это массив массивов, а не массив указателей. Представление a[N][N] и a[N*N] в памяти одинаково на любой платформе. Разница только в типе a[N].
Ответить | Правка | К родителю #31 | Наверх | Cообщить модератору

89. "Релиз Chrome 80"  +/
Сообщение от Аноним (88), 05-Фев-20, 20:54 
>Представление a[N][N] и a[N*N] в памяти одинаково на любой платформе.

То есть это вообще гарантировано:
https://stackoverflow.com/a/36647342

Ответить | Правка | Наверх | Cообщить модератору

92. "Релиз Chrome 80"  +/
Сообщение от Аноним (88), 05-Фев-20, 21:12 
Предельно наглядно:
#include <stdio.h>

int
main (void)
{
  char a[10][10] = { 0 };
  char *p = (char *)a;
  a[1][2] = 'h';
  printf ("%d\n", p[12]);
}

./a.out
104

Ответить | Правка | К родителю #88 | Наверх | Cообщить модератору

93. "Релиз Chrome 80"  –4 +/
Сообщение от Риттчи (?), 05-Фев-20, 21:17 
Ох артист, создаешь массив на стеке и берешь его указатель, создай ДИНАМИЧЕСКИЙ МАССИВ с РАНДОМНЫМ размером, хотя мы уже все поняли что ты в Си не могешь.
Ответить | Правка | Наверх | Cообщить модератору

97. "Релиз Chrome 80"  –1 +/
Сообщение от Аноним (88), 05-Фев-20, 21:27 
>Ох артист, создаешь массив на стеке и берешь его указатель

Что такое «указатель массива»?
>создай ДИНАМИЧЕСКИЙ МАССИВ

В C нет динамических массивов. Вы путаете массивы с указателями, как типичный первокурсник.

Ответить | Правка | Наверх | Cообщить модератору

100. "Релиз Chrome 80"  +/
Сообщение от Аноним (88), 05-Фев-20, 22:36 
Пожалуй, я сам немного запутался. Конечно, никто не мешает завести массив в динамической памяти:
#include <stdio.h>
#include <stdlib.h>

int
main (void)
{
  char (*ap)[5][10] = calloc (1, 50);
  char *p = (char*)ap;
  (*ap)[1][2] = 1;
  printf ("%d\n", p[12]);
}

./a.out
1

Ответить | Правка | Наверх | Cообщить модератору

116. "Релиз Chrome 80"  –1 +/
Сообщение от Аноним84701 (ok), 06-Фев-20, 03:19 
>  создай ДИНАМИЧЕСКИЙ МАССИВ с РАНДОМНЫМ размером,
> хотя мы уже все поняли что ты в Си не могешь.

Пишите под прежним ником "Знаток", "Эксперт".  Не нужно позорить этот – он этого не заслужил 🙄


(cat arr.c && gcc -O2 arr.c && ./a.out 700 10|(head -n3  && tail -n3 ))|cb
#include <stdio.h>
#include <stdlib.h>

#define TYPE int
#define _LOOP(VAR, N) for (size_t VAR=0; VAR<N; VAR++)
#define N_LOOP(V1, V2, V3, N) _LOOP(V1,N) _LOOP(V2,N) _LOOP(V3,N)

static void init(size_t len, TYPE arr[len][len][len], TYPE val) {
    N_LOOP(i,j,k,len) arr[i][j][k] = val++;
}

static void out(size_t len, TYPE arr[len][len][len]) {
    N_LOOP(i,j,k,len) printf("[%lu][%lu][%lu]: %d\n", i, j, k, arr[i][j][k]);
}

int main(int argc, char** argv) {
    size_t len = atoi(argv[1]);
    int val = atoi(argv[2]);
    typedef TYPE array[len][len][len];
    array *arr = malloc(sizeof(TYPE) * len * len * len);
    init(len, (void*)arr, val);
    (*arr)[len-1][len-1][len-2] = 1337;
    out(len, (void*)arr);
    return 0;
}
[0][0][0]: 10
[0][0][1]: 11
[0][0][2]: 12
[699][699][697]: 343000007
[699][699][698]: 1337
[699][699][699]: 343000009


Ответить | Правка | К родителю #93 | Наверх | Cообщить модератору

126. "Релиз Chrome 80"  –3 +/
Сообщение от Аноним (122), 06-Фев-20, 09:56 
Вместо придуривания и балабольства мог бы просто одну строчку написать что «в C99 появились variable length array». Закончишь свой институт — может быть и научишься с людьми общаться.
Ответить | Правка | Наверх | Cообщить модератору

137. "Релиз Chrome 80"  +3 +/
Сообщение от Аноним84701 (ok), 06-Фев-20, 14:02 
> Вместо придуривания и балабольства мог бы просто одну строчку написать

Т.е. по теме возразить уже нечего? Ну слава Биту!
> мог бы просто одну строчку написать что «в C99 появились variable length array».

Угу-угу, "Знаток" загуглил бы, половину не нашел, другую толком не понял,  но увидел бы на стековерфлоу что-то о "GCC allocates memory for VLA on stack" и продолжил бы далее "изоблачать".
Ну и лично мне были интересны тайминги/разница между многомерными массивов через жо^W указатели-на-указатели и  "классические, вычисляемые в рантайме" - я замерил и (не пропадать же коду зря) вырезав лишнее, скинул сюда.
И еще интересно, что "Уважаемый" "Знаток" "Эксперт" "Риттчи"  "̶С̶к̶р̶о̶м̶н̶я̶ш̶к̶а̶"̶ оказывается о VLA не знал, но упорно лез со своим ценным мнением о Си, необходимости таблиц указателей для многомерных массивов и прочей ереси – и при этом "балабол" оказался я? o_O

> и научишься с людьми общаться.

Судя по ответам ниже - вы и тут "Эксперт" (непризнанный, правда) :)

Понимаете, есть люди, а есть нагловатые, хамоватые и ламероватые анонимы, с завышенным ЧСВ и ценным мнением (впрочем, анонимность этому весьма способствует - если что: "это другой аноним, это не я! Чур!")
Которые, в ответ на _нормальное общение_ в #3.26, #5.40, сначала продолжают гнуть пальцы и хамить, а потом почему-то обижаются, когда их, просто и без политесов, макнут носом в лужу.

Ответить | Правка | Наверх | Cообщить модератору

140. "Релиз Chrome 80"  +/
Сообщение от Омномним (?), 06-Фев-20, 15:29 
Аноним и опозорился
Ответить | Правка | Наверх | Cообщить модератору

Архив | Удалить

Рекомендовать для помещения в FAQ | Индекс форумов | Темы | Пред. тема | След. тема




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру