typedef typename Tail::inUnion dummy;
Однако я не уверен, что реализация inUnion верна. Если я правильно понимаю, этот класс не должен быть создан, поэтому вкладка «fail» никогда не будет автоматически терпеть неудачу. Возможно, было бы лучше указать, находится ли тип в объединении или нет с простым булевым значением.
template
struct Contains; template struct Contains > { enum { result = Contains ::result }; }; template struct Contains > { enum { result = true }; }; template struct Contains { enum { result = false }; }; PS: Посмотрите на Boost :: Variant
PS2: посмотрите на typelists , особенно в книге Андрея Александреску: Modern C ++ Design
Короткий ответ, "используйте, какой бы ни точность требуется для приемлемых результатов. "
Ваша одна гарантия - то, что операции, выполненные на данных с плавающей запятой, сделаны, по крайней мере, в самом высоком участнике точности выражения. Так умножаясь два плавание сделано, по крайней мере, с точностью [1 112] плавание , и умножение , плавание и двойной было бы сделано, по крайней мере, с двойной точностью. В стандарте говорится, что" операции [с плавающей точкой] могут быть выполнены с более высокой точностью, чем тип результата операции".
, Учитывая, что JIT для.NET пытается оставить Ваши операции с плавающей точкой в точности требуемыми, мы можем смотреть на документацию от Intel для ускорения наших операций. На платформе Intel Ваши операции с плавающей точкой могут быть сделаны в промежуточной точности 80 битов и преобразованы вниз в точность, которую требуют.
От руководства Intel по C++ Операции С плавающей точкой <глоток> 1 глоток> (извините только имеют мертвое дерево), они упоминают:
- Использование тип одинарной точности (например, плавание), если дополнительная точность, полученная через двойной или двойное длинное, не требуется. Большие типы точности увеличивают требования пропускной способности и емкость памяти....
- Избегают смешанных арифметических выражений типа данных
, Что последняя точка важна как , можно замедлить себя с ненужными бросками, чтобы плавать и удвоиться , которые приводят к коду JIT'd, который запрашивает x87 выбросить от его 80-разрядного промежуточного формата промежуточные операции!
1. Да, это говорит C++, но стандарт C# плюс знание CLR сообщает нам, что информация для C++ должна быть применимой в этом экземпляре.
Я представил подобный вопрос несколько недель назад. Нижняя строка - то, что для x86 аппаратных средств, нет никакой значительной разницы в выполнении плаваний по сравнению с, удваивается, если Вы не становитесь памятью, связанной, или Вы начинаете сталкиваться с проблемой кэша. В этом случае плавания будут обычно иметь преимущество, потому что они меньше.
Текущий Intel CPUs выполняет все операции с плавающей точкой в регистрах 80 битов шириной, таким образом, действительная скорость вычисления не должна варьироваться между плаваниями и удваивается.
Если загрузка & операции хранилища являются узким местом, тогда плавает, будет быстрее, потому что они меньше. При выполнении значительного количества вычислений между загрузками и хранилищами это должно быть о равном.
Кто-то еще упомянул, что избежал преобразований между плаванием & дважды, и вычисления, которые используют операнды обоих типов. Это - хороший совет, и если Вы будете использовать какие-либо математические библиотечные функции, которые возврат удваивает (например), затем сохраняя все, как удваивается, то будет быстрее.
С 387 арифметиками FPU плавание только быстрее, чем дважды для определенных долгих повторяющихся операций как голова, журнал, и т.д. (и только если компилятор устанавливает управляющее слово FPU соответственно).
С упакованной арифметикой SSE, это имеет большое значение все же.
Это указывает, что плавания немного быстрее, чем удваивается: http://www.herongyang.com/cs_b/performance.html
В целом, какое-либо время Вы делаете сравнение на производительности, необходимо ли принять во внимание, что какие-либо особые случаи, как делает использование одного типа, требуют дополнительных преобразований или массирования данных? Те складывают и могут противоречить универсальным сравнительным тестам как это.
Плавания должны быть быстрее в 32-разрядной системе, но представить код, чтобы удостовериться, что Вы оптимизируете правильную вещь.
Я пишу трассировщик лучей, и замена поплавков на двойные для моего класса Color дает мне 5% ускорение. Замена поплавков Vectors на двойные еще на 5% быстрее! Довольно круто :)
Это с Core i7 920