Я подозреваю, что libpng делает это (стиль 2) по нескольким возможным причинам:
- Избегайте больших выделений (как уже упоминалось) и могут упростить обработку ОЧЕНЬ больших PNG, особенно в системах без ВМ
- (возможно), допускает чередованное декодирование с чередованием JPEG (если PNG это поддерживает)
- Легкость некоторых преобразований (вертикальное отражение) (маловероятно)
- Простота масштабирования (вставлять или удалять строки, не требуя полного второго буфера, или расширять / сужать строки) (маловероятно, но возможно)
Проблема с этим подходом (при условии, что каждая строка является выделением) является ОЧЕНЬ большим выделением / свободными издержками и, возможно, стимулирует фрагментацию памяти.
Если у вас нет веских причин, используйте стиль 1 (одиночное распределение) и, возможно, округлите до «хорошей» границы для используемой вами архитектуры (может быть 4, 8, 16 или, возможно, даже больше байтов). Обратите внимание, что многие библиотечные функции могут искать стиль 1 без отступов - подумайте, как вы будете использовать это и куда будете их передавать.