Используйте флаг компилятора -fno-strict-aliasing.
С включенным строгим псевдонимом, как по умолчанию для как минимум -O3, в строке:
size_t t = *((size_t*)&f);
компилятор предполагает, что size_t * НЕ указывает на ту же область памяти, что и float *. Насколько я знаю, это поведение, соответствующее стандартам (соблюдение строгих правил наложения имен в стандарте ANSI начинается с gcc-4, как отметил Томас Каммейер).
Если я правильно помню, вы можете использовать промежуточное приведение к char *, чтобы обойти это. (компилятор предполагает, что char * может иметь псевдоним что угодно)
Другими словами, попробуйте это (не могу проверить это прямо сейчас, но я думаю, что это будет работать):
size_t t = *((size_t*)(char*)&f);