Если дизассемблировать, видно, что в нижнем коде есть условный оператор, который проверяет, не пора ли ресайзить массив. В верхнем коде такого нет.
Более умный оптимизатор может в конечном итоге выкинуть и эту проверку, и тогда код станет идентичным.
Итого, это теоретический вопрос вида "у кого лучше оптимизатор". На практике, у верхнего кода больше шансов стать более быстрым даже при плохой оптимизации.
Разницы нет. Так как и в первом и во втором случае самая ресурсоемкая операция выполняется один раз. Во втором случае, проверку разумеется никакой оптимизатор не выбросит, но она 1) работает за константу и 2) практически не влияет за счёт branch prediction.
Есть случаи, когда невозможно (неудобно) использовать resize, есть, когда reserve. Для 99% случаев подходы идентичны.