ну чего, по-флеймим малек ?

Все, что вы хотели знать о программизме, но боялись спросить.
Аватара пользователя
ajkj3em
Маньяк
Сообщения: 2063
Зарегистрирован: 12 ноя 2006, 06:53

ну чего, по-флеймим малек ?

Сообщение ajkj3em »

имеем два класса, оба описывают кусок памяти в хипе. спрашиваетcя,
какой вариант более кошерный чисто с точки зрения дизайна кода ..
то есть без учета перформанса, битности char, и т.п.

Код: Выделить всё

struct foo
{
  char * ptr;  // first byte of the block
  char * end; // the byte after the last byte of the block
};

Код: Выделить всё

struct bar
{
  char * ptr;  // first byte
  size_t  len;  // the size of the block
};
size_t as per <stddef.h>
Аватара пользователя
nemiga
Маньяк
Сообщения: 2425
Зарегистрирован: 02 сен 2006, 19:05
Откуда: Minsk -> Seoul -> Ottawa

Re: ну чего, по-флеймим малек ?

Сообщение nemiga »

ajkj3em писал(а): struct foo
{
char * ptr; // first byte of the block
char * end; // the byte after the last byte of the block
};[/code]

Код: Выделить всё

struct bar
{
  char * ptr;  // first byte
  size_t  len;  // the size of the block
};

// size_t as per <stddef.h>[/quote]

Мне нравится второй. Сам так писал.

.
Аватара пользователя
Stanislav
Mr. Minority Report
Сообщения: 45211
Зарегистрирован: 19 окт 2005, 16:33
Откуда: Moscow - Richmond - New Wesт - Burnaby - PoCo

Сообщение Stanislav »

Второй конечно :-) Все мувы работают с указателем и размером. В принципе и в первом случае - вычисляемо - но это гланды через ж... как в том анекдоте :-)
Аватара пользователя
dima
Житель
Сообщения: 690
Зарегистрирован: 19 фев 2003, 19:26
Откуда: Хабаровск->Toronto

Сообщение dima »

почти все APIs (и системные финкции) передают указатель на начало памяти и длинну в байтах.

Используй второй.
Аватара пользователя
ajkj3em
Маньяк
Сообщения: 2063
Зарегистрирован: 12 ноя 2006, 06:53

Сообщение ajkj3em »

dima писал(а):почти все APIs (и системные финкции) передают указатель на начало памяти и длинну в байтах.

Используй второй.
спасибо за ц.у., но оно мне не нужно :)

вопрос был почему один вариант лучше другого с точки зрения
абстрактного дизайна структур данных, без привязки к каким
бы то нибыло API
Аватара пользователя
Marmot
Графоман
Сообщения: 39279
Зарегистрирован: 17 фев 2003, 17:58
Откуда: Caulfeild
Контактная информация:

Сообщение Marmot »

А как преполагается это дело использовать?
Use-cases, так-сказать давай...

Хотя чисто интуитивно, мне второй вариант больше нравится, потому как он более традиционен...
Опять же всякие там network protocols многие так сделаны (BTW авторов HTTP надо приговорить к расстрелу, IMO :) )
Аватара пользователя
ajkj3em
Маньяк
Сообщения: 2063
Зарегистрирован: 12 ноя 2006, 06:53

Сообщение ajkj3em »

Marmot писал(а):А как преполагается это дело использовать?
Use-cases, так-сказать давай...
hint нумер 1 - use-cases не принципиальны.
Аватара пользователя
aissp
Маньяк
Сообщения: 2710
Зарегистрирован: 07 ноя 2005, 09:51

Сообщение aissp »

В первом случае максимальный размер блока будет только 2 гига когда во втором ажно 4 :)
Аватара пользователя
Marmot
Графоман
Сообщения: 39279
Зарегистрирован: 17 фев 2003, 17:58
Откуда: Caulfeild
Контактная информация:

Сообщение Marmot »

ajkj3em писал(а): hint нумер 1 - use-cases не принципиальны.
Ну тады всеравно нумбер два.
Чтобы второй указатель по ногами не болтался, а то кто нибудь захочет туда чего нибудь прописать...
Чисто для защиты от совсем дураков...
Аватара пользователя
ajkj3em
Маньяк
Сообщения: 2063
Зарегистрирован: 12 ноя 2006, 06:53

Сообщение ajkj3em »

marmot, получай пирожок :)

правильный ответ - во втором случае у структуры нет инварианта
Аватара пользователя
aissp
Маньяк
Сообщения: 2710
Зарегистрирован: 07 ноя 2005, 09:51

Сообщение aissp »

Common :)

struct MemChunk {
size_t len;
char* block;
char* next;
}

Спрашивается что тут делает нехт? :) если идиот может туда чего записать:) И есть ли тут инвариант с точки зрения чунка? :)
Аватара пользователя
Marmot
Графоман
Сообщения: 39279
Зарегистрирован: 17 фев 2003, 17:58
Откуда: Caulfeild
Контактная информация:

Сообщение Marmot »

ajkj3em писал(а): правильный ответ - во втором случае у структуры нет инварианта
Пппереведи...
Аватара пользователя
nemiga
Маньяк
Сообщения: 2425
Зарегистрирован: 02 сен 2006, 19:05
Откуда: Minsk -> Seoul -> Ottawa

Сообщение nemiga »

ajkj3em писал(а):правильный ответ - во втором случае у структуры нет инварианта
Нифига себе. Я и словей (т.е., словов) таких не знаю :-)

Но как-то интуитивно выбрал правильный вариант...

.
Аватара пользователя
ajkj3em
Маньяк
Сообщения: 2063
Зарегистрирован: 12 ноя 2006, 06:53

Сообщение ajkj3em »

aissp писал(а):Common :)

struct MemChunk {
size_t len;
char* block;
char* next;
}

Спрашивается что тут делает нехт? :) если идиот может туда чего записать:) И есть ли тут инвариант с точки зрения чунка? :)
инвариант здесь -

Код: Выделить всё

next < block && block+len <= next
Аватара пользователя
ajkj3em
Маньяк
Сообщения: 2063
Зарегистрирован: 12 ноя 2006, 06:53

Сообщение ajkj3em »

Marmot писал(а):
ajkj3em писал(а): правильный ответ - во втором случае у структуры нет инварианта
Пппереведи...
инвариант - вто condition(s), который накладываетcя на содержимое
обьекта данных, чтобы он был в consistent/valid state. чем меньше у
класса инвариантов, тем лучше, потому что меньше шансов попасть
впросак.

более того, старик страуструп любит говорить, что class should enforce invariant -
My rule of thumb is that you should have a real class with an interface and a hidden representation if and only if you can consider an invariant for the class
у первой структуры есть инвариант -

Код: Выделить всё

ptr <= end
у второй - инвариантов нет (size_t is unsigned as per standard).
Ответить