powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / про realloc()..
17 сообщений из 17, страница 1 из 1
про realloc()..
    #34180528
Tubrik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
фрагмент...

Код: 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
про realloc()..
    #34180535
Tubrik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
или даже лучше так:
Код: 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
про realloc()..
    #34180553
Tubrik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
опять накосячил):
Код: 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
про realloc()..
    #34180609
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Думаю, при такой постановке нет смысла.

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

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

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

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

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

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

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

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

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

код:
Код: 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
про realloc()..
    #34182167
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Tubrikчто вообще происходит когда исчерпывается память? понятно что она перестает выделяться и происходит исключение, либо возвращается NULL, но как обрабатывать такие ситуации, если память всетаки должна быть выделена?

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

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

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

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

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

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

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

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

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

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

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

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

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


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