2015-02-05 4 views
2

В C есть способ установить статический U32, который может быть инициализирован в начале выполнения; но это похоже на остальную часть кода как const?Используйте const, чтобы создать переменную write once?

Моя попытка:

static const U32 writeOnce = 0; 

void init(U32 initVal) { 
    *(U32*)writeOnce = initVal; 
} 

Синтаксис принимается; но во время выполнения в противном случае использование readonly writeOnce было встроено непосредственно в коды операций и оптимизирована переменная.

Я думал, может быть, extern const мог бы работать; но не может обернуть мой мозг вокруг.

Основная необходимость сделать чтение ссылок на переменную максимально возможной для оптимизации; как только значение будет установлено во время выполнения.

Т.е. Если значение используется несколько раз с функцией, каким-то образом сказать компилятору, что ему нужно только один раз прочитать значение из памяти.

Hm. Теперь я объяснил это; Я думаю, что мне будет не повезло (энергонезависимого не существует :), но я все равно задаю вопрос и посмотрю, что произойдет.

Cheers, Buk.

+1

Там нет вообще портативного механизма, нет, но вы можете сортировать-намек на него вручную кэширование переменных, разумное использование статического/инлайн позволяет компилятору увидеть, что достижимо через где и 'restrict' к опровергнуть наложение указателя. Однажды в голубой луне я пошел так далеко, как использовать #pragmas (например, «__assume» MSVC), чтобы дать еще более тяжелые намеки на то, что оптимизатор действует. – doynax

+0

__restrict применяется только к указательным vars. Поскольку значение 32-бит, а указатели - 64-битные в этих системах; любая экономия, которая может возникнуть из-за неправильного ввода значения в качестве указателя, будет сведена на нет необходимостью получить в два раза больше, а затем усечь его. – user3404756

+0

И я не вижу никакого способа использовать __assume() для этого? Как вы думаете, предположите (этот var не изменится)? (И как раздражает, вы не можете использовать парамы в комментариях!) – user3404756

ответ

3

Единственный способ, который я могу видеть, чтобы помочь компилятору в этом отношении, - использовать локальную константу, которая инициализируется некорректным образом, например.

uint32_t gParam; 

void init() 
{ 
    gParam = some_value; 
} 

void foo() 
{ 
    const uint32_t kParam = gParam; 

    // ... loops/function calls involving const kParam 
} 

Я не совсем уверен, что это поможет в оптимизации, но, возможно, стоит попробовать.

+1

Это похоже на путь.По моему опыту, компиляторы намного лучше оптимизируют местных жителей, чем глобальные. – user694733

+0

Да, глобальные переменные являются проблематичными, поскольку компилятору сложно/невозможно узнать, будут ли они изменены, например. через указатель с псевдонимом. Еще одна причина, чтобы избежать глобалов! –

+0

Однократная глобальная запись используется многими функциями, в основном написанными другими людьми. Необходимость сохранения локальной копии на самом деле не является вариантом. – user3404756

0

Используйте флаг для управления доступом для записи.

U32 writeOnce = 0; // Value reported before it is written once during runtime. 

void init(U32 initVal) { 
    static bool writeOnceFlag = 0; 
    if (writeOnceFlag == 0) { 
    writeOnceFlag = 1; 
    writeOnce = initVal; 
    } 
} 
+1

Проблема не в том, чтобы помешать мне написать ей второй раз; Проблема заключается в том, чтобы сообщить компилятору, что он никогда не будет записан во второй раз. Это позволяет компилятору предположить, что безопасно кэшировать значение в регистре и не перечитывать его из памяти каждый раз, когда он ссылается. – user3404756

Смежные вопросы