Компилятор, который связывает свои собственные автономные версии malloc / calloc / free / realloc, может законно выполнить указанную оптимизацию, если авторы считают, что это стоило усилий.Компилятор, который связывает цепочки с внешними функциями, все еще может выполнять такие оптимизации, если он задокументировал, что он не рассматривал точную последовательность вызовов таких функций как наблюдаемый побочный эффект, но такая обработка могла бы быть немного более ненадежной.
Если между malloc () и realloc () не выделено или не выделено хранилище, размер realloc () известен при выполнении malloc (), а размер realloc () больше, чем malloc ()размер, тогда может иметь смысл объединить операции malloc () и realloc () в одно большее распределение.Однако, если состояние памяти может временно измениться, то такая оптимизация может привести к сбою операций, которые должны были быть выполнены успешно.Например, учитывая последовательность:
void *p1 = malloc(2000000000);
void *p2 = malloc(2);
free(p1);
p2 = realloc(p2, 2000000000);
система может не иметь 2000000000 байтов, доступных для p2, до тех пор, пока не будет освобожден p1.Если изменить код на:
void *p1 = malloc(2000000000);
void *p2 = malloc(2000000000);
free(p1);
, это приведет к сбою распределения p2.Поскольку стандарт никогда не гарантирует, что запросы на выделение будут успешными, такое поведение не будет несоответствующим.С другой стороны, следующее также может быть "соответствующей" реализацией:
void *malloc(size_t size) { return 0; }
void *calloc(size_t size, size_t count) { return 0; }
void free(void *p) { }
void *realloc(void *p, size_t size) { return 0; }
Такая реализация, вероятно, может рассматриваться как более "эффективная", чем большинство других, но одна из них должна быть довольно тупойрасценивать это как очень полезное, за исключением, возможно, в редких случаях, когда вышеупомянутые функции вызываются на пути кода, которые никогда не выполняются.
Я думаю, что Стандарт явно разрешил бы оптимизацию, по крайней мере, в случаях, когдатак же просто, как в оригинальном вопросе.Даже в тех случаях, когда это может привести к сбою операций, которые в противном случае могли бы быть успешными, Стандарт все равно разрешит это.Скорее всего, причина того, что многие компиляторы не выполняют оптимизацию, заключается в том, что авторы не считают, что преимущества будут достаточными для обоснования усилий, необходимых для выявления случаев, когда это было бы безопасно и полезно.