gcc static переменная
От: maks1180  
Дата: 24.11.22 05:29
Оценка:
у класса есть метод, в нём объявлена static переменная, вот так
void OnReceive() {
const int BUFFER_STATIC_SIZE = 65*1024;
static char BBB[BUFFER_STATIC_SIZE];

Обычно переменная BBB не занимает место в exe.
На gcc v4.8 on Linux — всё нормально, exe не увеличивается.
На gcc v10.2 on Windows, если метод в cpp то всё нормально, но если в header, то в exe добавляется 65Кб и заполняется нулями. Но зачем ?

Это баг gcc или так и должно быть ?
Почему выделение или не выделения места в exe для BBB зависит от того в cpp или h файле реализован метод ?

Может ли перемещенние данного буфера на стек замедлить скорость работы ?

Вызов call ___chkstk_ms, в начале функции для проверки есть ли место в стеке ?
Так как адрес статической переменной фиксирован, адрес на стеке динамический. Дополнительное вычисление адреса ?
Работа кэш памяти может быть хуже со стеком ?
===============================================
(реклама, удалена модератором)
Отредактировано 24.11.2022 6:29 maks1180 . Предыдущая версия . Еще …
Отредактировано 24.11.2022 5:30 maks1180 . Предыдущая версия .
Re: gcc static переменная
От: Aisons  
Дата: 24.11.22 18:01
Оценка: :)
Здравствуйте, maks1180, Вы писали:

M>у класса есть метод, в нём объявлена static переменная, вот так

M>void OnReceive() {
M> const int BUFFER_STATIC_SIZE = 65*1024;
M> static char BBB[BUFFER_STATIC_SIZE];

M>Обычно переменная BBB не занимает место в exe.

M>На gcc v4.8 on Linux — всё нормально, exe не увеличивается.
M>На gcc v10.2 on Windows, если метод в cpp то всё нормально, но если в header, то в exe добавляется 65Кб и заполняется нулями. Но зачем ?

M>Это баг gcc или так и должно быть ?

M>Почему выделение или не выделения места в exe для BBB зависит от того в cpp или h файле реализован метод ?

M>Может ли перемещенние данного буфера на стек замедлить скорость работы ?


M>Вызов call ___chkstk_ms, в начале функции для проверки есть ли место в стеке ?

M>Так как адрес статической переменной фиксирован, адрес на стеке динамический. Дополнительное вычисление адреса ?
M>Работа кэш памяти может быть хуже со стеком ?


Использовать оператора sizeof попробуй, по моему твой случай называеться сужающееся преобразование
Re[2]: gcc static переменная
От: maks1180  
Дата: 24.11.22 22:08
Оценка:
A>Использовать оператора sizeof попробуй, по моему твой случай называеться сужающееся преобразование

Не понял, как оператор sizeof тут использовать. Не нашёл в инете ничего про "сужающееся преобразование"
===============================================
(реклама, удалена модератором)
Re[2]: gcc static переменная
От: Videoman Россия https://hts.tv/
Дата: 24.11.22 22:28
Оценка:
Здравствуйте, Aisons, Вы писали:

M>>void OnReceive() {

M>> const int BUFFER_STATIC_SIZE = 65*1024;
M>> static char BBB[BUFFER_STATIC_SIZE];

A>Использовать оператора sizeof попробуй, по моему твой случай называеться сужающееся преобразование


Да не... он просто скобку '}' забыл закрыть.
Re: gcc static переменная
От: denis.st Россия  
Дата: 25.11.22 13:47
Оценка:
M>Обычно переменная BBB не занимает место в exe.
M>На gcc v4.8 on Linux — всё нормально, exe не увеличивается.
M>На gcc v10.2 on Windows, если метод в cpp то всё нормально, но если в header, то в exe добавляется 65Кб и заполняется нулями. Но зачем ?
А какие ключи при сборке используются? Был параметр чтобы компилятор засовывал такое не в bss, а в data.
Самый простой способ – взять тот же компилятор и попробовать тестовый файл собрать, с одной функцией и статической переменной.

M>Может ли перемещенние данного буфера на стек замедлить скорость работы ?

M>Вызов call ___chkstk_ms, в начале функции для проверки есть ли место в стеке ?
M>Так как адрес статической переменной фиксирован, адрес на стеке динамический. Дополнительное вычисление адреса ?
M>Работа кэш памяти может быть хуже со стеком ?
У тебя жёсткий рилтайм на слабых процессорах что ли? Больше смущает то что OnReceive нельзя одновременно несколько раз вызывать и это не проверяется.
Re[2]: gcc static переменная
От: maks1180  
Дата: 25.11.22 13:59
Оценка:
M>>Может ли перемещенние данного буфера на стек замедлить скорость работы ?
M>>Вызов call ___chkstk_ms, в начале функции для проверки есть ли место в стеке ?
M>>Так как адрес статической переменной фиксирован, адрес на стеке динамический. Дополнительное вычисление адреса ?
M>>Работа кэш памяти может быть хуже со стеком ?
DS>У тебя жёсткий рилтайм на слабых процессорах что ли? Больше смущает то что OnReceive нельзя одновременно несколько раз вызывать и это не проверяется.

Процессор не слабый, нагрузка большая на софт, более 100 тыс TCP соединений.
OnReceive вызывается только одним потом, поэтому static можно использовать.
===============================================
(реклама, удалена модератором)
Отредактировано 25.11.2022 13:59 maks1180 . Предыдущая версия .
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.