Кэш состоит из данных и меток ОЗУ, расположенных как компромисс между временем доступа и эффективностью, а также физической структурой. Вам не хватает важной характеристики: количество способов (сетов). У вас редко бывают односторонние кэши, потому что они патологически плохо работают с простыми шаблонами. В любом случае:
1) Да, теги занимают дополнительное место. Это является частью компромисса проекта - вы не хотите, чтобы он составлял большую часть общей площади, и почему размер строки не просто 1 байт или 1 слово. Кроме того, все теги для индекса доступны одновременно, и это может повлиять на эффективность и структуру, если существует большое количество способов. Размер немного больше, чем вы оцениваете. Также обычно есть несколько битов, чтобы отметить правильность, а иногда и подсказки. Большее количество путей и меньшие строки требуют большей доли, занимаемой тегами, поэтому обычно строки большие (32+ байта), а пути маленькие (4-16).
2) Да. Некоторые кэши также выполняют выборку «сначала критическое слово», где они начинаются со слова, вызвавшего заполнение строки, а затем выбирают остальные. Это уменьшает количество циклов, в течение которых процессор ожидает данные, которые он фактически запрашивал. Некоторые кэши «записывают через» и не выделяют строку, если вы пропустите запись, что избавляет от необходимости сначала читать всю строку кэша перед записью в нее (это не всегда выигрыш).
3) Теги не будут хранить младшие 5 бит, так как они не нужны для соответствия строке кэша. Они просто индексируются в отдельные строки.
В Википедии есть довольно хорошая, хотя и немного напряженная, запись о кешах: http://en.wikipedia.org/wiki/CPU_cache - см. «Реализация». Есть диаграмма того, как данные и теги разделены. Я думаю, что все должны изучить этот материал, потому что вы действительно можете улучшить производительность кода, когда знаете, на что способна базовая машина.