Внутренние части printf - PullRequest
       2

Внутренние части printf

4 голосов
/ 14 августа 2011

Каков предел памяти, который printf может использовать для хранения своих вычисленных аргументов?Какой общий объем памяти доступен для любой команды (с переменной номер аргумента) для хранения ее аргументов?

Пример кода:

#include <stdio.h>

#include <stdlib.h>


int main(int argc, char *argv[])

{

//by default the decimal is considered as double

float a = 0.9;

//long double b = (long double)23455556668989898988988998898999.99 ;

long double b = 5.32e-5;

double  z = 6789999000000.8999;


//b = (long double)1.99999999;

printf("float %f, \n double %lf,\n long double %Lf\n\n\n", b, b, b);

printf("simple:  long double %Lf, double %lf, float %f\n\n\n", b,b,b);

printf(" sumi: float %f, double %lf, long double %Lf\n\n\n", z, z, z);

printf("test2 for le/lg/lf: dbl f %Lf, double g %Lg, double e %Le\n\n\n", b, b, b);  

  system("PAUSE");  

  return 0;

}

Ответы [ 6 ]

2 голосов
/ 14 августа 2011

Нет конкретного ограничения.Самая большая опасность в чрезмерном количестве аргументов # / заключается в случайном переполнении стека.

Какой замечательный вопрос для "stackoverflow.com"; -)

1 голос
/ 14 августа 2011

Обычно аргументы просто идут в стеке вызовов, поэтому в однопоточном приложении основным ограничением является размер стека. В Posix вы можете использовать getrlimits() для определения этого размера или встроенную в Bash ulimit.

Более интересный вопрос может быть о том, сколько памяти printf имеет для результирующей строки и нужно ли ей выполнять выделение.

0 голосов
/ 14 августа 2011

Минимальные требования к памяти для printf для поддержки печати любого из типов, которые вы можете передать ему, составляют около 6 КБ стека, при условии 15-битного показателя степени на long double. Для любого типа с плавающей запятой вы можете обойтись с 200 байтами или меньше.

Конечно, большинство реальных реализаций здесь не максимально эффективны. glibc по крайней мере выполняет malloc как часть printf, по крайней мере, для некоторых форматов, и, таким образом, имеет непредсказуемые случаи сбоев. Насколько я могу судить, это просто ленивое кодирование ... Не знаю, что делает MS printf, но я бы не ожидал, что качественный код там тоже ...

0 голосов
/ 14 августа 2011

printf не требуется хранить что-либо.И это может быть реализовано таким образом.Получить аргумент и распечатать его для вывода с форматированием.

0 голосов
/ 14 августа 2011

Это зависит от реализации и настроек (ОС, настройки и т. Д.). Как правило, локальные переменные и аргументы хранятся в стеке, а размер такого стека зависит от платформы, личных настроек и т. Д.

Если обычно нехорошо хранить большие значения в стеке. Если ваша функция вызывает другие функции, им также нужно место в стеке и т. Д.

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

Только не храните слишком большие значения в локальном кадре.

0 голосов
/ 14 августа 2011

Нет фиксированного лимита. Некоторые системы имеют только несколько байтов стека (возможно, 128 или 256), в других - несколько мегабайт. У некоторых есть куча, которая затем используется функциями, у других нет. Некоторые внутренние функции могут использовать статическую память, другие реализации - нет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...