Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> malloc и sizeof, чудеса с sizeof-ом 
V
    Опции темы
Dr_VOLAND
  Дата 25.9.2009, 22:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 91
Регистрация: 16.9.2007

Репутация: нет
Всего: 0



Доброй ночи!
Видима глюки у меня, ПОЧЕМУ когда я хочу выделить память под long, и пишу: 
Код

long *var1;
var1 = (long*) malloc (20*sizeof(long));
printf("sizeof var1 = %d",sizeof(var1));

Код

Я ПОЛУЧАЮ:
>> sizeof var1 = 8!!!!


???
PM MAIL   Вверх
Anikmar
Дата 25.9.2009, 22:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2513
Регистрация: 26.11.2006
Где: Санкт-Петербург

Репутация: 9
Всего: 59



А каков по вашему должен быть размер указателя?
PM MAIL ICQ   Вверх
Dr_VOLAND
Дата 25.9.2009, 22:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 91
Регистрация: 16.9.2007

Репутация: нет
Всего: 0



вопрос хороший конечно, наверное написал я что не так. Но мне нужен размер ячейки памяти на каторую указывает указатель (звеняйте за каламбур)
PM MAIL   Вверх
zim22
Дата 25.9.2009, 22:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


Профиль
Группа: Завсегдатай
Сообщений: 2682
Регистрация: 15.1.2009
Где: Украина

Репутация: 24
Всего: 69



Цитата(Dr_VOLAND @  25.9.2009,  22:08 Найти цитируемый пост)
размер ячейки памяти на каторую указывает указатель 

тогда к указателю нужно применить dereference operator и брать уже его sizeof
Код

sizeof(*val1)

***
так понятней?
Код


short *p;
int r = sizeof(*p);
r = sizeof(p);

class X {
  char buf[256];
} *ptr;
r = sizeof(ptr);
r = sizeof(*ptr);


Это сообщение отредактировал(а) zim22 - 25.9.2009, 22:27


--------------------
PM MAIL   Вверх
Anikmar
Дата 25.9.2009, 22:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2513
Регистрация: 26.11.2006
Где: Санкт-Петербург

Репутация: 9
Всего: 59



Цитата(zim22 @  25.9.2009,  22:22 Найти цитируемый пост)
тогда к указателю нужно применить dereference operator и брать уже его sizeof

И как это поможет в ситуации с malloc?
PM MAIL ICQ   Вверх
Dr_VOLAND
Дата 25.9.2009, 22:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 91
Регистрация: 16.9.2007

Репутация: нет
Всего: 0



"я чувствовал это!!").  Спасибо Зим, но не помогло. Да я не написало, что собственно хочу увидеть - а увидеть хочу я 20*8.
Так как sizeof(long) - это 8, а 20 * sizeof(long) - соответсвенно 160.
PM MAIL   Вверх
Anikmar
Дата 25.9.2009, 22:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2513
Регистрация: 26.11.2006
Где: Санкт-Петербург

Репутация: 9
Всего: 59



Цитата(Dr_VOLAND @  25.9.2009,  22:34 Найти цитируемый пост)
"я чувствовал это!!").  Спасибо Зим, но не помогло. Да я не написало, что собственно хочу увидеть - а увидеть хочу я 20*8.
Так как sizeof(long) - это 8, а 20 * sizeof(long) - соответсвенно 160. 

Не получится.  smile 
PM MAIL ICQ   Вверх
Dr_VOLAND
Дата 25.9.2009, 22:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 91
Регистрация: 16.9.2007

Репутация: нет
Всего: 0



вай?   ближе к делу, я сейчас копаюсь с pvm (для любознательных Parallel Virtual Machine). Так вот, мне нужно создать объемную переменную запаковать её и отправить слейву, на что дружок должен прислать мне привет. 
Вот и проблема у меня встала, как создать эту самую обьемистую переменную... без всякого напихивания паралона в неё.

Это сообщение отредактировал(а) Dr_VOLAND - 25.9.2009, 22:48
PM MAIL   Вверх
andrew_121
Дата 25.9.2009, 22:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодофей
****


Профиль
Группа: Завсегдатай
Сообщений: 3448
Регистрация: 3.1.2008

Репутация: 6
Всего: 33



что-то я не въезжаю.... кто задает вопрос, и кто отвечает?!

Цитата(Dr_VOLAND @  25.9.2009,  22:34 Найти цитируемый пост)
Так как sizeof(long) - это 8

что за железка, компилятор?

Добавлено через 8 минут и 45 секунд
Цитата(Dr_VOLAND @  25.9.2009,  22:34 Найти цитируемый пост)
20 * sizeof(long) - соответсвенно 160. 

так. что тебе нужно?
1. 160 бит?
2. 160 байт?
3. массив из 20-ти long-ов?


--------------------
Удалил аккаунт. Прощайте!
PM MAIL   Вверх
Dr_VOLAND
Дата 25.9.2009, 23:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 91
Регистрация: 16.9.2007

Репутация: нет
Всего: 0



вспышка с лева, с права - появление профи и сразу вопрос по делу. ок. про железяку - работаю удаленно на серваке, посему знаю что AMD64, крутится фря, а компилятор gcc-шный 4.2.1
PM MAIL   Вверх
andrew_121
Дата 25.9.2009, 23:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодофей
****


Профиль
Группа: Завсегдатай
Сообщений: 3448
Регистрация: 3.1.2008

Репутация: 6
Всего: 33



Цитата(Dr_VOLAND @  25.9.2009,  23:04 Найти цитируемый пост)
AMD64, крутится фря, а компилятор gcc-шный 4.2.1 

ок. значит sizeof(long) == 8. первое выяснили. далее.


Цитата(andrew_121 @  25.9.2009,  22:52 Найти цитируемый пост)
так. что тебе нужно?
1. 160 бит?
2. 160 байт?
3. массив из 20-ти long-ов?



Это сообщение отредактировал(а) andrew_121 - 25.9.2009, 23:08


--------------------
Удалил аккаунт. Прощайте!
PM MAIL   Вверх
Dr_VOLAND
Дата 25.9.2009, 23:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 91
Регистрация: 16.9.2007

Репутация: нет
Всего: 0



нужно 160 байт, запаковать их спецфункцией pvm_pklong и послать в космос
PM MAIL   Вверх
andrew_121
Дата 25.9.2009, 23:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодофей
****


Профиль
Группа: Завсегдатай
Сообщений: 3448
Регистрация: 3.1.2008

Репутация: 6
Всего: 33



Код

long* buff = (long*)malloc(20*sizeof(long));
assert(buff);
int pack = pvm_pklong(buff, 20, ...);



--------------------
Удалил аккаунт. Прощайте!
PM MAIL   Вверх
Dr_VOLAND
Дата 25.9.2009, 23:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 91
Регистрация: 16.9.2007

Репутация: нет
Всего: 0



я понимаю, и тоже так пишу... но вот в чем проблема, проверяя скорость передачи я вижу что скорость рукопожатия (посылки туда и обратно), для одного и 160 байтов у меня одинакова, этого не может быть. согласны? (сеть не гигабитная=)
поэтому я хочу чётко знать что посылаю 160 байт!

Это сообщение отредактировал(а) Dr_VOLAND - 26.9.2009, 00:40
PM MAIL   Вверх
andrew_121
Дата 26.9.2009, 00:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодофей
****


Профиль
Группа: Завсегдатай
Сообщений: 3448
Регистрация: 3.1.2008

Репутация: 6
Всего: 33



В этом фрагменте кода все в порядке. Смотри, возможно что-то еще у тебя не так.


--------------------
Удалил аккаунт. Прощайте!
PM MAIL   Вверх
bilbobagginz
Дата 26.9.2009, 00:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Naughtius Maximus
****


Профиль
Группа: Экс. модератор
Сообщений: 8813
Регистрация: 2.3.2004
Где: Israel

Репутация: 3
Всего: 317



Цитата(Dr_VOLAND @  25.9.2009,  22:35 Найти цитируемый пост)
для одного и 160 байтов у меня одинакова, этого не может быть.

спокойно может быть.
что за сеть ?



--------------------
Я ещё не демон. Я только учусь.
PM WWW   Вверх
Anikmar
Дата 26.9.2009, 09:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2513
Регистрация: 26.11.2006
Где: Санкт-Петербург

Репутация: 9
Всего: 59



Начали с работы sizeof теперь чувствую перейдем к сетям и фреймам.

Если мои телепатические способности не врут, я предполагаю, что автору топика нужно получить из сетки некий объем байт и он с помощью оператора sizeof хочет узнать размер полученных данных. 
PM MAIL ICQ   Вверх
MAKCim
Дата 26.9.2009, 09:37 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 52
Всего: 207



Цитата(Dr_VOLAND @  25.9.2009,  23:35 Найти цитируемый пост)
проверяя скорость передачи я вижу что скорость рукопожатия (посылки туда и обратно), для одного и 160 байтов у меня одинакова, этого не может быть. согласны?

не согласен
1. время установления TCP соединения не зависит от количества байт, которые будут по нему передаваться
2. с близкой к 100% вероятностью все 160 байт будут переданы в первом же пакете после установления соединения


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
bilbobagginz
Дата 26.9.2009, 11:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Naughtius Maximus
****


Профиль
Группа: Экс. модератор
Сообщений: 8813
Регистрация: 2.3.2004
Где: Israel

Репутация: 3
Всего: 317



пришел MAKCim, и весь дидактический процесс наводящих вопросов опошлил
 smile 


--------------------
Я ещё не демон. Я только учусь.
PM WWW   Вверх
Dr_VOLAND
Дата 26.9.2009, 11:43 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 91
Регистрация: 16.9.2007

Репутация: нет
Всего: 0



погонял я трафик по сети, и увидел что скорость передачи начинает меняться после 3 Кбайт, до этого передача 0-3000 байт по сети не различается.

возвращаемся с первоначальному вопросу про sizeof:
Код

пишем printf("sizeof(char) = %d\n",sizeof(char)); // sizeof(char) = 1
пишем printf("sizeof(int) = %d\n",sizeof(int)); // sizeof(int) = 4
пишем printf("sizeof("hello") = %d\n",sizeof("hello")); // sizeof("hello") = 6
пишем printf("sizeof("24") = %d\n",sizeof("24")); // sizeof("24") = 3
пишем printf("sizeof(24) = %d\n",sizeof(24)); // sizeof(24) = 4 (так как int)


пишем:
Код

unsigned char *str;
str = malloc (1000*sizeof(unsigned char));
printf("sizeof(*str) = %d\n",sizeof(*str)); // sizeof(*str) = 1


как узнать что комп выделил именно 1000байт для указателя *str, которую я хочу запаковать, и переслать слейву?

Это сообщение отредактировал(а) Dr_VOLAND - 26.9.2009, 14:33
PM MAIL   Вверх
zim22
Дата 26.9.2009, 12:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


Профиль
Группа: Завсегдатай
Сообщений: 2682
Регистрация: 15.1.2009
Где: Украина

Репутация: 24
Всего: 69



Цитата(Dr_VOLAND @  26.9.2009,  11:43 Найти цитируемый пост)
как узнать что комп выделил именно 1000байт для указателя *str

?
Код

unsigned char *str;
int qty = 1000;
str = malloc (qty*sizeof(unsigned char));
printf("sizeof(*str) = %d\n",qty); 






--------------------
PM MAIL   Вверх
GoldFinch
Дата 26.9.2009, 12:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Завсегдатай
Сообщений: 2141
Регистрация: 30.11.2008

Репутация: 15
Всего: 26



Цитата(Dr_VOLAND @  26.9.2009,  12:43 Найти цитируемый пост)
как узнать что комп выделил 

выделил не комп, а программист который написал malloc(N)
вот чему равно N - столько и выделилось
PM MAIL ICQ   Вверх
MAKCim
Дата 26.9.2009, 12:47 (ссылка) |    (голосов:3) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 52
Всего: 207



Цитата(Dr_VOLAND @  26.9.2009,  11:43 Найти цитируемый пост)
до этого передача 0-3000 байт по сети не различается.

учитывая, что в большинстве случаев PMTU <= MTU = 1500 байт, то либо у вас определенно не обычная ethernet локалка, либо вы что-то измерили неправильно ;)

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

struct packed_data
{
    struct desc desc;
    char data[0];
};



--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
Anikmar
Дата 26.9.2009, 12:54 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2513
Регистрация: 26.11.2006
Где: Санкт-Петербург

Репутация: 9
Всего: 59



Цитата(MAKCim @  26.9.2009,  12:47 Найти цитируемый пост)
что в большинстве случаев PMTU <= MTU = 1500 байт

В большинстве, но не во всех. Запросто и 4К может быть и более.

Если TCP будет маленькие пакеты аккумулировать, то большой может даже быстрее маленького уйти.

Цитата(Dr_VOLAND @  26.9.2009,  11:43 Найти цитируемый пост)
как узнать что комп выделил именно 1000байт для указателя *str, которую я хочу запаковать, и переслать слейву?

Если malloc отработал без ошибки - значит он выделил.

оператор sizeof высчитывается на этапе компиляции и в вашем случае бесполезен - так как он не знает ничего про malloc и как орна отработала.

PM MAIL ICQ   Вверх
Dov
Дата 26.9.2009, 13:34 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


аСинизатор
***


Профиль
Группа: Завсегдатай
Сообщений: 1721
Регистрация: 10.5.2003
Где: Эрец-Исраэль

Репутация: 15
Всего: 88



Цитата(Dr_VOLAND @ 26.9.2009,  11:43)

пишем:
Код

unsigned char *str;
str = malloc (1000*sizeof(unsigned char));
printf("sizeof(*str) = %d\n",sizeof(*str)); // sizeof(*str) = 1


как узнать что комп выделил именно 1000байт для указателя *str, которую я хочу запаковать, и переслать слейву?

Код

unsigned char *str;
str = (unsigned char*)malloc (1000*sizeof(unsigned char));
printf("size of str = %d\n",_msize(str));



--------------------
Тут вечности запах томительный,
И свежие фрукты дешевые, 
А климат у нас – изумительный, 
И только соседи – #уевые. 
                           Игорь Губерман.
PM   Вверх
Dr_VOLAND
Дата 26.9.2009, 13:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 91
Регистрация: 16.9.2007

Репутация: нет
Всего: 0



Anikmar, у меня как раз на малых обьемах так и происходит, что
Цитата(Anikmar @  26.9.2009,  10:54 Найти цитируемый пост)
Если TCP будет маленькие пакеты аккумулировать, то большой может даже быстрее маленького уйти.

PM MAIL   Вверх
Dr_VOLAND
Дата 26.9.2009, 14:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 91
Регистрация: 16.9.2007

Репутация: нет
Всего: 0



Dov к сожалению не катит, хотя я б с радостью попробовал. Для этого хака нужна malloc.h, на что компилятор начинает выть - поменяй на stdlib.h
PM MAIL   Вверх
MAKCim
Дата 26.9.2009, 14:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 52
Всего: 207



Цитата(Anikmar @  26.9.2009,  12:54 Найти цитируемый пост)

В большинстве, но не во всех. Запросто и 4К может быть и более.

а прочитать до конца фразу слабо? ;)
я вроде не зря уточнил про два возможных варианта


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
Dov
Дата 26.9.2009, 15:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


аСинизатор
***


Профиль
Группа: Завсегдатай
Сообщений: 1721
Регистрация: 10.5.2003
Где: Эрец-Исраэль

Репутация: 15
Всего: 88



Dr_VOLAND, тогда делай проверку. При невозможности выделить запрашиваемое количество памяти тебе будет об этом сообщено. В противном случае ты будешь уверен, что всё прошло успешно.
Код
    unsigned char *str;
    str = (unsigned char*)malloc (1000*sizeof(unsigned char));
    if( str == NULL)
    {
        puts("Много хочешь, мало получишь...");
        exit(1);
    }
    printf("size of str = %d\n",1000*sizeof(unsigned char));



Это сообщение отредактировал(а) Dov - 26.9.2009, 15:26


--------------------
Тут вечности запах томительный,
И свежие фрукты дешевые, 
А климат у нас – изумительный, 
И только соседи – #уевые. 
                           Игорь Губерман.
PM   Вверх
Dr_VOLAND
Дата 26.9.2009, 17:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 91
Регистрация: 16.9.2007

Репутация: нет
Всего: 0



Всем спасибо! тему закрыл.
PM MAIL   Вверх
Anikmar
Дата 26.9.2009, 18:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2513
Регистрация: 26.11.2006
Где: Санкт-Петербург

Репутация: 9
Всего: 59



Цитата(MAKCim @  26.9.2009,  14:19 Найти цитируемый пост)
а прочитать до конца фразу слабо? ;)

Я только хотел вашу фразу усилить, а не оспорить. Вообще может и 64 К быть  smile 

Цитата(Dr_VOLAND @  26.9.2009,  13:37 Найти цитируемый пост)
Anikmar, у меня как раз на малых обьемах так и происходит

Если конкретная реализация TCP/IP поддерживает алгоритм Нэгла, то она может придержать маленький пакет, чтобы не тратить время сетки на подтверждение. Поэтому большой пакет может уйти быстрее маленького и нет тут ничего сверхестественного. Как правильно сказал MAKCim, все зависит от размера пакета и размера MTU на конкретной сетке. 
Если пакет намного меньше максимального размера сегмента, протокол придержит его в надежде на то, что добавится еще пакет и сегмент не уйдет почти пустой. Типа догрузить попутный груз, чтобы фуру не гнать порожняком. 
PM MAIL ICQ   Вверх
Страницы: (3) [Все] 1 2 3 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0869 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.