Перейти к содержанию
    

On 12/27/2022 at 1:55 PM, Forger said:

-1 байт озу делает погоду? 

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

почему один байт? 100 генериков - 100 байт.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

3 minutes ago, jenya7 said:

100 генериков - 100 байт.

Третий спрашиваю: о какой памяти в ВАШЕМ понимании идет речь?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

On 12/27/2022 at 2:03 PM, Forger said:

Третий спрашиваю: о какой памяти в ВАШЕМ понимании идет речь?

ок. взять камень с достаточным объёмом RAM это тоже вполне себе решение. 

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

2 minutes ago, jenya7 said:

ок. взять камень с достаточным объёмом RAM это тоже вполне себе решение. 

По ходу вы вообще не понимаете как и где "тратится" память. Разберитесь для начала хотя бы с этим.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

On 12/27/2022 at 2:14 PM, Forger said:

По ходу вы вообще не понимаете как и где "тратится" память. Разберитесь для начала хотя бы с этим.

typedef struct  
{
    uint8_t type;
    void *v;
} FOO;

FOO foos[100];

foos[1].type = IS_INT;
foos[1].v = &val;

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

9 minutes ago, jenya7 said:
typedef struct  
{
    uint8_t type;
    void *v;
} FOO;

FOO foos[100];

foos[1].type = IS_INT;
foos[1].v = &val;

 

Вот, уже хоть какая доп. информация! Увы, ее приходится вытягивать клещами

Если делать "в лоб", как у вас в примере, то действительно минус 100 байт RAM. По существу нет никакого смысла хранить type в RAM.

Для этого куда больше подходит ROM.

 

 

 

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

On 12/27/2022 at 2:38 PM, Forger said:

Вот, уже хоть какая доп. информация! Увы, ее приходится вытягивать клещами

Если делать "в лоб", как у вас в примере, то действительно минус 100 байт RAM. По существу нет никакого смысла хранить type в RAM.

Для этого куда больше подходит ROM.

ROM это уже другая история 🙂

мне интересно почему компайлер не позволяет переопределить тип

(uint8_t *)generic = &flag[4];

что в этом несбыточного.

Изменено пользователем jenya7

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Quote

почему компайлер не позволяет переопределить тип

Потому что потом он не сможет понять к какому типу данных обращаться в данный момент при исполнении.

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

2 hours ago, jenya7 said:

как мне одним параметром сообщить

У тебя есть два путЯ.

Первый. Передавать параметр в виде строки текста, например, так:

"%b 123"
"%i -12345"

Второй. Использовать для компиляции С++, используя или перегруженную функцию, или шаблон, который сгенерирует функции для нужных типов.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

On 12/27/2022 at 3:16 PM, tonyk_av said:

У тебя есть два путЯ.

Первый. Передавать параметр в виде строки текста, например, так:

"%b 123"
"%i -12345"

Второй. Использовать для компиляции С++, используя или перегруженную функцию, или шаблон, который сгенерирует функции для нужных типов.

А что С++ генерик тип <T> не отжирает память?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

4 hours ago, jenya7 said:

можно было сделать так

int size = sizeof(generic);
    
if (size == 1)
    (*((uint8_t *)generic)) = val;
else
    (*((int *)generic)) = val;

Нельзя, потому что sizeof(generic) всегда будет возвращать одно и то же значение, равное размеру адреса.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

думал так

typedef struct  
{
    union {
    char *cp;
    int *ip;
    double *dp;
  } v;
} FOO;

FOO foos[100];

foos[1].v.cp = &val;

но sizeof(v) всё равно будет 4? он возьмёт по большему члену.

 

а может по размеру переменной?

if (val < 256)
    (*((uint8_t *)generic)) = val;
else
   (*((int *)generic)) = val;

по любому правильно расположится в памяти.

Изменено пользователем jenya7

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В 27.12.2022 в 16:24, jenya7 сказал:

А что С++ генерик тип <T> не отжирает память?

отжирает, только вместо байта imho отожрёт указатель на информацию о типе

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

6 minutes ago, jenya7 said:

но sizeof(v) всё равно будет 4? он возьмёт по большему члену.

возможно и все 8 байт (если double 8-байтный)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 hour ago, jenya7 said:

а может по размеру переменной?

А смысл? Память все равно при этом никак не экономится. Какая разница что помещать в эти 4(8) байт юниона - однобайтовое значение или четырехбайтовое? Все равно в памяти будет занят фиксированный размер, равный размеру наибольшего члена.

И, честно говоря, я так и не понял какой цели нужно достичь с помощью всего этого колдунства.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...