Структура или матрица для регистра?

Я хочу иметь регистр, содержащий 4 байта адреса и 4 байта данных. Для этого я подумал о том, чтобы создать его в виде массива структур (содержащих адрес и данные в качестве элементов) или в виде матрицы. Вот пример кода для проверки того, чего я хочу достичь:

#include <stdio.h>
#include <stdint.h>

void reg_init();
#define REG_SIZE 1
typedef struct Reg{
    uint8_t addr[4];
    uint8_t data[4];
} reg;

static reg reg_struct[REG_SIZE];
static uint8_t reg_matrix[REG_SIZE][8];


int main()
{
    int index=-1;
    reg_init();
    for(int i=0; i<REG_SIZE; i++)
    {
        uint8_t addr_to_check[4] = {0x12,0x34,0x56,0x78};
        // FOR STRUCT
        for(int j=0; j<4; j++)
        {
            if (addr_to_check[j]!=reg_struct[i].addr[j]) break;
            if (j==3) index = i;
        }

        //FOR MATRIX
        for(int j=0; j<4; j++)
        {
            if (addr_to_check[j]!=reg_matrix[i][j]) break;
            if (j==3) index = i;
        }
    }
    if (index<0) printf("Address not found\n");
    else printf("Address at index: %i",index);
    return 0;
}
void reg_init()
{
    // Register init for testing
    reg_struct[0].addr[0] = 0x12;
    reg_struct[0].addr[1] = 0x34;
    reg_struct[0].addr[2] = 0x56;
    reg_struct[0].addr[3] = 0x78;
    reg_struct[0].data[0] = 0x01;
    reg_struct[0].data[1] = 0x02;
    reg_struct[0].data[2] = 0x03;
    reg_struct[0].data[3] = 0x04;
    reg_matrix[0][0] = 0x12;
    reg_matrix[0][1] = 0x34;
    reg_matrix[0][2] = 0x56;
    reg_matrix[0][3] = 0x78;
    reg_matrix[0][4] = 0x01;
    reg_matrix[0][5] = 0x02;
    reg_matrix[0][6] = 0x03;
    reg_matrix[0][7] = 0x04;
}

В примере показан только регистр единичного размера, но размер будет намного больше (до 8 байт). В целом меня интересует оптимизация с точки зрения производительности. Действительно ли важно использовать тот или иной код, или компилятор будет строить тот же самый машинный код?

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
57
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Ниже приведена сборка приведенного выше кода, созданная с помощью Visual Studio 2019.
Посмотрите на номер строки записи ; Line 50 и ; Line 51, похоже, что компилятор создал один и тот же ассемблерный код для матрицы и структуры.

; Listing generated by Microsoft (R) Optimizing Compiler Version 19.20.27508.1 

    TITLE   D:\main.c
    .686P
    .XMM
    include listing.inc
    .model  flat

INCLUDELIB LIBCMT
INCLUDELIB OLDNAMES

PUBLIC  ___local_stdio_printf_options
PUBLIC  __vfprintf_l
PUBLIC  _printf
PUBLIC  _reg_init
PUBLIC  _main
EXTRN   ___acrt_iob_func:PROC
EXTRN   ___stdio_common_vfprintf:PROC
_DATA   SEGMENT
COMM    ?_OptionsStorage@?1??__local_stdio_printf_options@@9@9:QWORD                            ; `__local_stdio_printf_options'::`2'::_OptionsStorage
_DATA   ENDS
_BSS    SEGMENT
_reg_struct DQ  01H DUP (?)
_reg_matrix DB  08H DUP (?)
_BSS    ENDS
_DATA   SEGMENT
$SG8132 DB  'Address not found', 0aH, 00H
    ORG $+1
$SG8133 DB  'Address at index: %i', 00H
_DATA   ENDS
; Function compile flags: /Odtp
_TEXT   SEGMENT
_index$ = -20                       ; size = 4
_addr_to_check$1 = -16                  ; size = 4
_j$2 = -12                      ; size = 4
_j$3 = -8                       ; size = 4
_i$4 = -4                       ; size = 4
_main   PROC
; File D:\main.c
; Line 16
    push    ebp
    mov ebp, esp
    sub esp, 20                 ; 00000014H
; Line 17
    mov DWORD PTR _index$[ebp], -1
; Line 18
    call    _reg_init
; Line 19
    mov DWORD PTR _i$4[ebp], 0
    jmp SHORT $LN4@main
$LN2@main:
    mov eax, DWORD PTR _i$4[ebp]
    add eax, 1
    mov DWORD PTR _i$4[ebp], eax
$LN4@main:
    cmp DWORD PTR _i$4[ebp], 1
    jge $LN3@main
; Line 21
    mov BYTE PTR _addr_to_check$1[ebp], 18  ; 00000012H
    mov BYTE PTR _addr_to_check$1[ebp+1], 52    ; 00000034H
    mov BYTE PTR _addr_to_check$1[ebp+2], 86    ; 00000056H
    mov BYTE PTR _addr_to_check$1[ebp+3], 120   ; 00000078H
; Line 23
    mov DWORD PTR _j$3[ebp], 0
    jmp SHORT $LN7@main
$LN5@main:
    mov ecx, DWORD PTR _j$3[ebp]
    add ecx, 1
    mov DWORD PTR _j$3[ebp], ecx
$LN7@main:
    cmp DWORD PTR _j$3[ebp], 4
    jge SHORT $LN6@main
; Line 25
    mov edx, DWORD PTR _j$3[ebp]
    movzx   eax, BYTE PTR _addr_to_check$1[ebp+edx]
    mov ecx, DWORD PTR _j$3[ebp]
    mov edx, DWORD PTR _i$4[ebp]
    movzx   ecx, BYTE PTR _reg_struct[ecx+edx*8]
    cmp eax, ecx
    je  SHORT $LN11@main
    jmp SHORT $LN6@main
$LN11@main:
; Line 26
    cmp DWORD PTR _j$3[ebp], 3
    jne SHORT $LN12@main
    mov edx, DWORD PTR _i$4[ebp]
    mov DWORD PTR _index$[ebp], edx
$LN12@main:
; Line 27
    jmp SHORT $LN5@main
$LN6@main:
; Line 30
    mov DWORD PTR _j$2[ebp], 0
    jmp SHORT $LN10@main
$LN8@main:
    mov eax, DWORD PTR _j$2[ebp]
    add eax, 1
    mov DWORD PTR _j$2[ebp], eax
$LN10@main:
    cmp DWORD PTR _j$2[ebp], 4
    jge SHORT $LN9@main
; Line 32
    mov ecx, DWORD PTR _j$2[ebp]
    movzx   edx, BYTE PTR _addr_to_check$1[ebp+ecx]
    mov eax, DWORD PTR _j$2[ebp]
    mov ecx, DWORD PTR _i$4[ebp]
    movzx   eax, BYTE PTR _reg_matrix[eax+ecx*8]
    cmp edx, eax
    je  SHORT $LN13@main
    jmp SHORT $LN9@main
$LN13@main:
; Line 33
    cmp DWORD PTR _j$2[ebp], 3
    jne SHORT $LN14@main
    mov ecx, DWORD PTR _i$4[ebp]
    mov DWORD PTR _index$[ebp], ecx
$LN14@main:
; Line 34
    jmp SHORT $LN8@main
$LN9@main:
; Line 35
    jmp $LN2@main
$LN3@main:
; Line 36
    cmp DWORD PTR _index$[ebp], 0
    jge SHORT $LN15@main
    push    OFFSET $SG8132
    call    _printf
    add esp, 4
    jmp SHORT $LN16@main
$LN15@main:
; Line 37
    mov edx, DWORD PTR _index$[ebp]
    push    edx
    push    OFFSET $SG8133
    call    _printf
    add esp, 8
$LN16@main:
; Line 38
    xor eax, eax
; Line 39
    mov esp, ebp
    pop ebp
    ret 0
_main   ENDP
_TEXT   ENDS
; Function compile flags: /Odtp
_TEXT   SEGMENT
_reg_init PROC
; File D:\main.c
; Line 41
    push    ebp
    mov ebp, esp
; Line 43
    mov eax, 8
    imul    ecx, eax, 0
    mov edx, 1
    imul    eax, edx, 0
    mov BYTE PTR _reg_struct[ecx+eax], 18   ; 00000012H
; Line 44
    mov ecx, 8
    imul    edx, ecx, 0
    mov eax, 1
    shl eax, 0
    mov BYTE PTR _reg_struct[edx+eax], 52   ; 00000034H
; Line 45
    mov ecx, 8
    imul    edx, ecx, 0
    mov eax, 1
    shl eax, 1
    mov BYTE PTR _reg_struct[edx+eax], 86   ; 00000056H
; Line 46
    mov ecx, 8
    imul    edx, ecx, 0
    mov eax, 1
    imul    ecx, eax, 3
    mov BYTE PTR _reg_struct[edx+ecx], 120  ; 00000078H
; Line 47
    mov edx, 8
    imul    eax, edx, 0
    mov ecx, 1
    imul    edx, ecx, 0
    mov BYTE PTR _reg_struct[eax+edx+4], 1
; Line 48
    mov eax, 8
    imul    ecx, eax, 0
    mov edx, 1
    shl edx, 0
    mov BYTE PTR _reg_struct[ecx+edx+4], 2
; Line 49
    mov eax, 8
    imul    ecx, eax, 0
    mov edx, 1
    shl edx, 1
    mov BYTE PTR _reg_struct[ecx+edx+4], 3
; Line 50
    mov eax, 8
    imul    ecx, eax, 0
    mov edx, 1
    imul    eax, edx, 3
    mov BYTE PTR _reg_struct[ecx+eax+4], 4
; Line 51
    mov ecx, 8
    imul    edx, ecx, 0
    mov eax, 1
    imul    ecx, eax, 0
    mov BYTE PTR _reg_matrix[edx+ecx], 18   ; 00000012H
; Line 52
    mov edx, 8
    imul    eax, edx, 0
    mov ecx, 1
    shl ecx, 0
    mov BYTE PTR _reg_matrix[eax+ecx], 52   ; 00000034H
; Line 53
    mov edx, 8
    imul    eax, edx, 0
    mov ecx, 1
    shl ecx, 1
    mov BYTE PTR _reg_matrix[eax+ecx], 86   ; 00000056H
; Line 54
    mov edx, 8
    imul    eax, edx, 0
    mov ecx, 1
    imul    edx, ecx, 3
    mov BYTE PTR _reg_matrix[eax+edx], 120  ; 00000078H
; Line 55
    mov eax, 8
    imul    ecx, eax, 0
    mov edx, 1
    shl edx, 2
    mov BYTE PTR _reg_matrix[ecx+edx], 1
; Line 56
    mov eax, 8
    imul    ecx, eax, 0
    mov edx, 1
    imul    eax, edx, 5
    mov BYTE PTR _reg_matrix[ecx+eax], 2
; Line 57
    mov ecx, 8
    imul    edx, ecx, 0
    mov eax, 1
    imul    ecx, eax, 6
    mov BYTE PTR _reg_matrix[edx+ecx], 3
; Line 58
    mov edx, 8
    imul    eax, edx, 0
    mov ecx, 1
    imul    edx, ecx, 7
    mov BYTE PTR _reg_matrix[eax+edx], 4
; Line 59
    pop ebp
    ret 0
_reg_init ENDP
_TEXT   ENDS
; Function compile flags: /Odtp
;   COMDAT _printf
_TEXT   SEGMENT
__Result$ = -8                      ; size = 4
__ArgList$ = -4                     ; size = 4
__Format$ = 8                       ; size = 4
_printf PROC                        ; COMDAT
; File C:\Program Files (x86)\Windows Kits\10\include\10.0.17763.0\ucrt\stdio.h
; Line 954
    push    ebp
    mov ebp, esp
    sub esp, 8
; Line 957
    lea eax, DWORD PTR __Format$[ebp+4]
    mov DWORD PTR __ArgList$[ebp], eax
; Line 958
    mov ecx, DWORD PTR __ArgList$[ebp]
    push    ecx
    push    0
    mov edx, DWORD PTR __Format$[ebp]
    push    edx
    push    1
    call    ___acrt_iob_func
    add esp, 4
    push    eax
    call    __vfprintf_l
    add esp, 16                 ; 00000010H
    mov DWORD PTR __Result$[ebp], eax
; Line 959
    mov DWORD PTR __ArgList$[ebp], 0
; Line 960
    mov eax, DWORD PTR __Result$[ebp]
; Line 961
    mov esp, ebp
    pop ebp
    ret 0
_printf ENDP
_TEXT   ENDS
; Function compile flags: /Odtp
;   COMDAT __vfprintf_l
_TEXT   SEGMENT
__Stream$ = 8                       ; size = 4
__Format$ = 12                      ; size = 4
__Locale$ = 16                      ; size = 4
__ArgList$ = 20                     ; size = 4
__vfprintf_l PROC                   ; COMDAT
; File C:\Program Files (x86)\Windows Kits\10\include\10.0.17763.0\ucrt\stdio.h
; Line 642
    push    ebp
    mov ebp, esp
; Line 643
    mov eax, DWORD PTR __ArgList$[ebp]
    push    eax
    mov ecx, DWORD PTR __Locale$[ebp]
    push    ecx
    mov edx, DWORD PTR __Format$[ebp]
    push    edx
    mov eax, DWORD PTR __Stream$[ebp]
    push    eax
    call    ___local_stdio_printf_options
    mov ecx, DWORD PTR [eax+4]
    push    ecx
    mov edx, DWORD PTR [eax]
    push    edx
    call    ___stdio_common_vfprintf
    add esp, 24                 ; 00000018H
; Line 644
    pop ebp
    ret 0
__vfprintf_l ENDP
_TEXT   ENDS
; Function compile flags: /Odtp
;   COMDAT ___local_stdio_printf_options
_TEXT   SEGMENT
___local_stdio_printf_options PROC          ; COMDAT
; File C:\Program Files (x86)\Windows Kits\10\include\10.0.17763.0\ucrt\corecrt_stdio_config.h
; Line 86
    push    ebp
    mov ebp, esp
; Line 88
    mov eax, OFFSET ?_OptionsStorage@?1??__local_stdio_printf_options@@9@9 ; `__local_stdio_printf_options'::`2'::_OptionsStorage
; Line 89
    pop ebp
    ret 0
___local_stdio_printf_options ENDP
_TEXT   ENDS
END

Другие вопросы по теме