Страница 1 из 4

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

Добавлено: 10 янв 2007, 23:27
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>

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

Добавлено: 10 янв 2007, 23:33
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]

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

.

Добавлено: 11 янв 2007, 08:17
Stanislav
Второй конечно :-) Все мувы работают с указателем и размером. В принципе и в первом случае - вычисляемо - но это гланды через ж... как в том анекдоте :-)

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

Используй второй.

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

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

вопрос был почему один вариант лучше другого с точки зрения
абстрактного дизайна структур данных, без привязки к каким
бы то нибыло API

Добавлено: 11 янв 2007, 10:30
Marmot
А как преполагается это дело использовать?
Use-cases, так-сказать давай...

Хотя чисто интуитивно, мне второй вариант больше нравится, потому как он более традиционен...
Опять же всякие там network protocols многие так сделаны (BTW авторов HTTP надо приговорить к расстрелу, IMO :) )

Добавлено: 11 янв 2007, 10:42
ajkj3em
Marmot писал(а):А как преполагается это дело использовать?
Use-cases, так-сказать давай...
hint нумер 1 - use-cases не принципиальны.

Добавлено: 11 янв 2007, 10:45
aissp
В первом случае максимальный размер блока будет только 2 гига когда во втором ажно 4 :)

Добавлено: 11 янв 2007, 10:50
Marmot
ajkj3em писал(а): hint нумер 1 - use-cases не принципиальны.
Ну тады всеравно нумбер два.
Чтобы второй указатель по ногами не болтался, а то кто нибудь захочет туда чего нибудь прописать...
Чисто для защиты от совсем дураков...

Добавлено: 11 янв 2007, 10:59
ajkj3em
marmot, получай пирожок :)

правильный ответ - во втором случае у структуры нет инварианта

Добавлено: 11 янв 2007, 11:20
aissp
Common :)

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

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

Добавлено: 11 янв 2007, 11:22
Marmot
ajkj3em писал(а): правильный ответ - во втором случае у структуры нет инварианта
Пппереведи...

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

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

.

Добавлено: 11 янв 2007, 12:05
ajkj3em
aissp писал(а):Common :)

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

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

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

next < block && block+len <= next

Добавлено: 11 янв 2007, 12:16
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).