| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Общие вопросы > malloc и sizeof |
| Автор: Dr_VOLAND 25.9.2009, 22:00 | ||||
| Доброй ночи! Видима глюки у меня, ПОЧЕМУ когда я хочу выделить память под long, и пишу:
??? |
| Автор: Anikmar 25.9.2009, 22:01 |
| А каков по вашему должен быть размер указателя? |
| Автор: Dr_VOLAND 25.9.2009, 22:08 |
| вопрос хороший конечно, наверное написал я что не так. Но мне нужен размер ячейки памяти на каторую указывает указатель (звеняйте за каламбур) |
| Автор: zim22 25.9.2009, 22:22 | ||||
тогда к указателю нужно применить dereference operator и брать уже его sizeof
*** так понятней?
|
| Автор: Anikmar 25.9.2009, 22:34 | ||
И как это поможет в ситуации с malloc? |
| Автор: Dr_VOLAND 25.9.2009, 22:34 |
| "я чувствовал это!!"). Спасибо Зим, но не помогло. Да я не написало, что собственно хочу увидеть - а увидеть хочу я 20*8. Так как sizeof(long) - это 8, а 20 * sizeof(long) - соответсвенно 160. |
| Автор: Dr_VOLAND 25.9.2009, 22:46 |
| вай? ближе к делу, я сейчас копаюсь с pvm (для любознательных Parallel Virtual Machine). Так вот, мне нужно создать объемную переменную запаковать её и отправить слейву, на что дружок должен прислать мне привет. Вот и проблема у меня встала, как создать эту самую обьемистую переменную... без всякого напихивания паралона в неё. |
| Автор: andrew_121 25.9.2009, 22:52 |
| что-то я не въезжаю.... кто задает вопрос, и кто отвечает?! что за железка, компилятор? Добавлено через 8 минут и 45 секунд так. что тебе нужно? 1. 160 бит? 2. 160 байт? 3. массив из 20-ти long-ов? |
| Автор: Dr_VOLAND 25.9.2009, 23:04 |
| вспышка с лева, с права - появление профи и сразу вопрос по делу. ок. про железяку - работаю удаленно на серваке, посему знаю что AMD64, крутится фря, а компилятор gcc-шный 4.2.1 |
| Автор: andrew_121 25.9.2009, 23:07 | ||
ок. значит sizeof(long) == 8. первое выяснили. далее.
|
| Автор: Dr_VOLAND 25.9.2009, 23:11 |
| нужно 160 байт, запаковать их спецфункцией pvm_pklong и послать в космос |
| Автор: andrew_121 25.9.2009, 23:20 | ||
|
| Автор: Dr_VOLAND 25.9.2009, 23:35 |
| я понимаю, и тоже так пишу... но вот в чем проблема, проверяя скорость передачи я вижу что скорость рукопожатия (посылки туда и обратно), для одного и 160 байтов у меня одинакова, этого не может быть. согласны? (сеть не гигабитная=) поэтому я хочу чётко знать что посылаю 160 байт! |
| Автор: andrew_121 26.9.2009, 00:08 |
| В этом фрагменте кода все в порядке. Смотри, возможно что-то еще у тебя не так. |
| Автор: bilbobagginz 26.9.2009, 00:47 |
спокойно может быть. что за сеть ? |
| Автор: Anikmar 26.9.2009, 09:16 |
| Начали с работы sizeof теперь чувствую перейдем к сетям и фреймам. Если мои телепатические способности не врут, я предполагаю, что автору топика нужно получить из сетки некий объем байт и он с помощью оператора sizeof хочет узнать размер полученных данных. |
| Автор: MAKCim 26.9.2009, 09:37 | ||
не согласен 1. время установления TCP соединения не зависит от количества байт, которые будут по нему передаваться 2. с близкой к 100% вероятностью все 160 байт будут переданы в первом же пакете после установления соединения |
| Автор: bilbobagginz 26.9.2009, 11:37 |
| пришел MAKCim, и весь дидактический процесс наводящих вопросов опошлил |
| Автор: Dr_VOLAND 26.9.2009, 11:43 | ||||
| погонял я трафик по сети, и увидел что скорость передачи начинает меняться после 3 Кбайт, до этого передача 0-3000 байт по сети не различается. возвращаемся с первоначальному вопросу про sizeof:
пишем:
как узнать что комп выделил именно 1000байт для указателя *str, которую я хочу запаковать, и переслать слейву? |
| Автор: zim22 26.9.2009, 12:16 | ||
?
|
| Автор: GoldFinch 26.9.2009, 12:35 |
выделил не комп, а программист который написал malloc(N) вот чему равно N - столько и выделилось |
| Автор: MAKCim 26.9.2009, 12:47 | ||
учитывая, что в большинстве случаев PMTU <= MTU = 1500 байт, то либо у вас определенно не обычная ethernet локалка, либо вы что-то измерили неправильно ;) если я вас правильно понял, то почему бы не хранить размер данных в некотором дескрипторе, который передается с остальными данными типа
|
| Автор: Anikmar 26.9.2009, 12:54 | ||
В большинстве, но не во всех. Запросто и 4К может быть и более. Если TCP будет маленькие пакеты аккумулировать, то большой может даже быстрее маленького уйти.
Если malloc отработал без ошибки - значит он выделил. оператор sizeof высчитывается на этапе компиляции и в вашем случае бесполезен - так как он не знает ничего про malloc и как орна отработала. |
| Автор: Dov 26.9.2009, 13:34 | ||||||
|
| Автор: Dr_VOLAND 26.9.2009, 13:37 |
| Anikmar, у меня как раз на малых обьемах так и происходит, что |
| Автор: Dr_VOLAND 26.9.2009, 14:04 |
| Dov к сожалению не катит, хотя я б с радостью попробовал. Для этого хака нужна malloc.h, на что компилятор начинает выть - поменяй на stdlib.h |
| Автор: MAKCim 26.9.2009, 14:19 |
а прочитать до конца фразу слабо? ;) я вроде не зря уточнил про два возможных варианта |
| Автор: Dov 26.9.2009, 15:25 | ||
Dr_VOLAND, тогда делай проверку. При невозможности выделить запрашиваемое количество памяти тебе будет об этом сообщено. В противном случае ты будешь уверен, что всё прошло успешно.
|
| Автор: Dr_VOLAND 26.9.2009, 17:58 |
| Всем спасибо! тему закрыл. |
| Автор: Anikmar 26.9.2009, 18:03 |
Я только хотел вашу фразу усилить, а не оспорить. Вообще может и 64 К быть Если конкретная реализация TCP/IP поддерживает алгоритм Нэгла, то она может придержать маленький пакет, чтобы не тратить время сетки на подтверждение. Поэтому большой пакет может уйти быстрее маленького и нет тут ничего сверхестественного. Как правильно сказал MAKCim, все зависит от размера пакета и размера MTU на конкретной сетке. Если пакет намного меньше максимального размера сегмента, протокол придержит его в надежде на то, что добавится еще пакет и сегмент не уйдет почти пустой. Типа догрузить попутный груз, чтобы фуру не гнать порожняком. |