Цитата(XVR @ Aug 1 2018, 14:33)
Нет. В массив могут записать 'сбоку' (не через указатель на него).
Мне кажется странными если оптимизатор делает такие предположения.
Вставил этот код в IAR, вот что он выдал:
Код
86 nv0 = chain[0]->nv;
\ 00000004 0x6A41 LDR R1,[R0, #+36];1-е чтение chain[0]
\ 00000006 0x684A LDR R2,[R1, #+4] ;чтение chain[0]->nv
\ 00000008 0x6042 STR R2,[R0, #+4] ;запись nv0
87 nvf0 = chain[0]->fmt[ixf0 = chain[0]->ixf].n;
\ 0000000A 0x6889 LDR R1,[R1, #+8] ;чтение chain[0]->ixf
\ 0000000C 0x6A42 LDR R2,[R0, #+36];3-е чтение chain[0]
\ 0000000E 0x6081 STR R1,[R0, #+8] ;запись ixf0
\ 00000010 0xEB02 0x1101 ADD R1,R2,R1, LSL #+4
\ 00000014 0x6989 LDR R1,[R1, #+24] ;чтение chain[0]->fmt[ixf0].n
\ 00000016 0x60C1 STR R1,[R0, #+12] ;запись nvf0
Как видно - IAR так не предполагает: он выкинул 2-е чтение chain[0] из памяти, использовав старое значение в регистре, хоть перед этим и была запись в память.
3-е чтение он правда оставил, хотя мог бы тоже использовать если-б не разрушил его перед тем.
Более того - он и 3-е чтение расположил до записи ixf0, хотя если следовать Вашей логике не должен был этого делать. Так что на возможности затирания записями ему наплевать, так как: side effects - это забота программиста.