Крупным заблуждением является попытка делать предположение о том, во что превратит компилятор ваш код - любая смена версии компилятора или минорная правка могут изменить итоговый ассемблер до неузнаваемости.
Формально, компилятор где-то запоминает, сколько он выделил памяти, и скорее всего, делает это где-то в байтах до указателя, но практически, на это полагаться нельзя.
Стоп-стоп-стоп. Откуда взялось delete? Мы про C или C++?
В любом случае, delete можно давать на вход только то, что вернула когда-то new. Если вы скормите delete лажу вроде указателя на середину строки, будет неопределенное поведение.
Нет, размер и скорость - противоположные оптимизации.
Уменьшить размер программы можно, путем устранения inline-вызовов, что приведет к тормозам.
Другой пример: ускорить программу можно, заменив циклы на линейные наборы инструкций (loop-unroll (его и включает -O3)), что опять же увеличит размер бинарника.