Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / про realloc().. / 17 сообщений из 17, страница 1 из 1
06.12.2006, 14:16
    #34180528
Tubrik
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
про realloc()..
фрагмент...

Код: plaintext
1.
2.
3.
4.
	char *tmp = (char *)malloc( sizeof(char) *  128  );

	sprintf( tmp, "%s", GetAnyText() );

	tmp = realloc(tmp_bnd, sizeof(char) * (strlen(tmp) +  1 ));

...конец фрагмента

ф-ия GetAnyText() возвращает текст длиной не более 127 символов, стоит ли потом (как показано в фрагементе) убирать все что больше длины полученной строки при помощи realloc()?
сильно ли это сказывается на производительности, если используется очень плотно?
...
Рейтинг: 0 / 0
06.12.2006, 14:18
    #34180535
Tubrik
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
про realloc()..
или даже лучше так:
Код: plaintext
1.
2.
3.
4.
	char *tmp = (char *)malloc( sizeof(char) *  128  );

	size_t  len = sprintf( tmp, "%s", GetAnyText() );

	tmp = realloc(tmp, sizeof(char) * (len +  1 ));

...конец фрагмента
...
Рейтинг: 0 / 0
06.12.2006, 14:21
    #34180553
Tubrik
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
про realloc()..
опять накосячил):
Код: plaintext
1.
2.
3.
4.
	char *tmp = (char *)malloc( sizeof(char) *  128  );

	size_t  len = sprintf( tmp, "%s", GetAnyText() );

	tmp = (char *)realloc(tmp, sizeof(char) * (len +  1 ));

...конец фрагмента
...
Рейтинг: 0 / 0
06.12.2006, 14:34
    #34180609
Akh
Akh
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
про realloc()..
Думаю, при такой постановке нет смысла.

Если будет много строк, то смысл будет (ограничение памяти), но лучше будет рассмотреть другие варианты, например создание строк через буфер.
...
Рейтинг: 0 / 0
06.12.2006, 14:40
    #34180630
Tubrik
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
про realloc()..
AkhДумаю, при такой постановке нет смысла.

Если будет много строк, то смысл будет (ограничение памяти), но лучше будет рассмотреть другие варианты, например создание строк через буфер.

Как через буфер?
...
Рейтинг: 0 / 0
06.12.2006, 15:31
    #34180849
Akh
Akh
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
про realloc()..
Tubrik AkhДумаю, при такой постановке нет смысла.

Если будет много строк, то смысл будет (ограничение памяти), но лучше будет рассмотреть другие варианты, например создание строк через буфер.

Как через буфер?

Получаешь в постоянный буфер. Считаешь длину, делаешь malloc.
...
Рейтинг: 0 / 0
06.12.2006, 15:50
    #34180929
maXmo
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
про realloc()..
strdup
...
Рейтинг: 0 / 0
06.12.2006, 20:08
    #34181598
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
про realloc()..
ф-ия GetAnyText() возвращает текст длиной не более 127 символов, стоит ли потом (как показано в фрагементе) убирать все что больше длины полученной строки при помощи realloc()?

Если не нужно очень сильно экономить память, то не нужно.
Если заботится о производительности - точно не нужно.

сильно ли это сказывается на производительности, если используется очень плотно?

Да, безусловно сильно. Выделение памяти - очень дорогая операция.
...
Рейтинг: 0 / 0
06.12.2006, 23:42
    #34181766
Tubrik
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
про realloc()..
исключительно ради интереса собственного сделал, может конечно и не слишком грамотно:

код:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
char *str(NULL);	
	char *temp(NULL);
	unsigned n( 1000000 ), m( 10 );
	time_t	t_start( 0 ), t_finish( 0 );
	size_t	len( 0 );

	srand(time(NULL));
	t_start = time(NULL);
	
	while (--m)
	{
		n =  1000000 ;

		while (--n)
		{
			temp = (char *)malloc( sizeof(char) *  64  );
			len = sprintf(temp, "%u", rand());
			temp = (char *)realloc( temp, sizeof(char) * (len +  1 ) );
			free(temp);
		}//while

	}//while

	t_finish = time(NULL);
	printf("\ntime token = %u\n", t_finish - t_start);
	getch();
сборка: release
время выполнения в сек. : 15, 12, 13, 12, 12, 13, 13, 13, 13, 12

код:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
	char *str(NULL);	
	char *temp(NULL);
	unsigned n( 1000000 ), m( 10 );
	time_t	t_start( 0 ), t_finish( 0 );
	size_t	len( 0 );

	srand(time(NULL));
	t_start = time(NULL);
	
	while (--m)
	{
		n =  1000000 ;

		while (--n)
		{
			temp = (char *)malloc( sizeof(char) *  64  );
			len = sprintf(temp, "%u", rand());
			//temp = (char *)realloc( temp, sizeof(char) * (len + 1) );
			free(temp);
		}//while

	}//while

	t_finish = time(NULL);
	printf("\ntime token = %u\n", t_finish - t_start);
	getch();
сборка: release
время выполнения: 11, 11, 11, 11, 11, 10, 11, 11, 11, 11

код:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
	char *str(NULL);	
	char *temp(NULL);
	unsigned n( 1000000 ), m( 10 );
	time_t	t_start( 0 ), t_finish( 0 );
	size_t	len( 0 );

	srand(time(NULL));
	t_start = time(NULL);
	
	while (--m)
	{
		n =  1000000 ;

		while (--n)
		{
			temp = (char *)malloc( sizeof(char) *  64  );
			len = sprintf(temp, "%u", rand());
			temp = (char *)realloc( temp, sizeof(char) * (len +  1 ) );
			//free(temp);
		}//while

	}//while

	t_finish = time(NULL);
	printf("\ntime token = %u\n", t_finish - t_start);
	getch();
сборка: release
время выполнения: 12, 11, 12, 12, 11, 12, 13, 11, 13, 11, 12

код:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
	char *str(NULL);	
	char *temp(NULL);
	unsigned n( 1000000 ), m( 10 );
	time_t	t_start( 0 ), t_finish( 0 );
	size_t	len( 0 );

	srand(time(NULL));
	t_start = time(NULL);
	
	while (--m)
	{
		n =  1000000 ;

		while (--n)
		{
			temp = (char *)malloc( sizeof(char) *  64  );
			len = sprintf(temp, "%u", rand());
			//temp = (char *)realloc( temp, sizeof(char) * (len + 1) );
			//free(temp);
		}//while

	}//while

	t_finish = time(NULL);
	printf("\ntime token = %u\n", t_finish - t_start);
	getch();
сборка: release
время: 30, 18, 15, 16.
причем когда я наблюдал в диспетчере задач, размер приложения перевалив отметку примерно в 400 000 кб. сбрасывался и остчет снова начинался с нуля
КАК ОБЪЯСНИТЬ СЕЙ ФАКТ??
единственная догадка, что исчерпывалась доступная память, но почему проиходил сброс?
что вообще происходит когда исчерпывается память? понятно что она перестает выделяться и происходит исключение, либо возвращается NULL, но как обрабатывать такие ситуации, если память всетаки должна быть выделена?
...
Рейтинг: 0 / 0
07.12.2006, 09:43
    #34182167
Akh
Akh
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
про realloc()..
Tubrikчто вообще происходит когда исчерпывается память? понятно что она перестает выделяться и происходит исключение, либо возвращается NULL, но как обрабатывать такие ситуации, если память всетаки должна быть выделена?

Идти запосными путями, удалять что-то не нужноре, сообщать об ошибке
...
Рейтинг: 0 / 0
07.12.2006, 10:57
    #34182435
Tubrik
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
про realloc()..
Akh Tubrikчто вообще происходит когда исчерпывается память? понятно что она перестает выделяться и происходит исключение, либо возвращается NULL, но как обрабатывать такие ситуации, если память всетаки должна быть выделена?

Идти запосными путями, удалять что-то не нужноре, сообщать об ошибке

Когда нехватает памяти система начинает другие приложения "сгружать" на диск, тогда если в своем приложении подождать нек. время, и снова пропробовать выделить память, то может получиться?
...
Рейтинг: 0 / 0
07.12.2006, 11:01
    #34182456
Akh
Akh
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
про realloc()..
Tubrik Akh Tubrikчто вообще происходит когда исчерпывается память? понятно что она перестает выделяться и происходит исключение, либо возвращается NULL, но как обрабатывать такие ситуации, если память всетаки должна быть выделена?

Идти запосными путями, удалять что-то не нужноре, сообщать об ошибке

Когда нехватает памяти система начинает другие приложения "сгружать" на диск, тогда если в своем приложении подождать нек. время, и снова пропробовать выделить память, то может получиться?

Может получиться. Она, впринципе, и часть твоего может сгрузить на диск.
...
Рейтинг: 0 / 0
07.12.2006, 13:17
    #34183062
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
про realloc()..
КАК ОБЪЯСНИТЬ СЕЙ ФАКТ??

Ой, лениво мне это ковырять..

что вообще происходит когда исчерпывается память? понятно что она перестает выделяться и происходит исключение, либо возвращается NULL,

Именно возвращается NULL. В C нет исключений.

но как обрабатывать такие ситуации, если память всетаки должна быть выделена?

Никак. Завершать приложение. Или в цикле пытаться выделять память и если неудачно
выдавать сообщение что памяти нет, надо закрыть пару-тройку приложений....
...
Рейтинг: 0 / 0
07.12.2006, 13:18
    #34183066
Akh
Akh
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
про realloc()..
MasterZivНикак. Завершать приложение. Или в цикле пытаться выделять память и если неудачно
выдавать сообщение что памяти нет, надо закрыть пару-тройку приложений....

Довольно не интеллектуальный алгоритм.
...
Рейтинг: 0 / 0
07.12.2006, 16:02
    #34183813
maXmo
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
про realloc()..
AkhДовольно не интеллектуальный алгоритм.перезагрузиться :)
...
Рейтинг: 0 / 0
07.12.2006, 16:03
    #34183819
maXmo
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
про realloc()..
если у приложения неограничен WorkingSet, свин начнёт увеличивать файл подкачки и лучше вам на это не смотреть :)
...
Рейтинг: 0 / 0
12.12.2006, 12:38
    #34192861
guest_061213
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
про realloc()..
Работаю со строками переменной длины с помощью функции
(простейший вариант)

char* strcatex(char* dst,const char *src)
{
char* tmp =(char*)calloc(strlen(dst)+strlen(src)+1,sizeof(char));
char* q=tmp;
const char* p=dst;
while(*p!=0){*q++=*p++;}
p=src;
while(*p!=0){*q++=*p++;}

free(dst); // Не забыть !

return tmp;


}

Перед первым использованием выделяем память

const int N= сколькоНужноДляНачала;
char* s =(char*)calloc(N,sizeof(char));

затем
s=strcatex(s,"Нечто");

после последнего вызова чистим
free(s);
...
Рейтинг: 0 / 0
Форумы / C++ [игнор отключен] [закрыт для гостей] / про realloc().. / 17 сообщений из 17, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]