Это может или не может иметь значение здесь, потому что I / O - самая медленная вещь, которая должна происходить здесь, но все эти преобразования не влияют на производительность и могут даже привести к ошибочному коду.Приведение говорит компилятору «я делаю здесь что-то странное», и это говорит компилятору не оптимизировать.
Например, на большинстве платформ размер float
составляет 4 байта, ибыстрее назначить 4-байтовое значение по адресу, кратному 4, чем по произвольному адресу.Когда компилятор видит переменную типа float
или массив float
, он правильно выровняет эту переменную в памяти, чтобы иметь возможность использовать метод быстрого 4-байтового присваивания.Когда компилятор видит (float *) (weights+j*0x04)
, он не уверен, является ли он кратным 4, поэтому он может генерировать код, который обязательно скопирует то, что вы ожидаете, но медленнее, потому что он копирует отдельные байты один за другим.(Компилятору не нужно генерировать более медленный код: он может быть неприятным и предполагать, что weights
правильно выровнен, и генерировать код, который не копирует то, что вы ожидаете, если weights
не выровнен правильно.)
Тело цикла должно быть просто
fscanf(fp, "%f", weights[j]);
(Предполагая, что вы знаете, что входной файл правильно сформирован, в противном случае вам нужно добавить проверку ошибок.)