2013-07-09 4 views
4

Я пишу vector.go как часть моей программы. Он обеспечивает трехмерную структуру vector и некоторые векторные операции.Накладные расходы типа «псевдоним» в Go

Для симметрии с общим vector типа, я хотел бы предоставить scalar тип:

type scalar float64 

Мне это нравится, потому что нет никаких причин, я должен указать точность моих скаляров каждый раз. Тот факт, что они являются 64-битными, - это деталь, которую я бы скорее уточнил только один раз.

Единственная проблема заключается в том, что я знаю, что это не так, как typedef в C. Кажется, что происходит больше, чем за кулисами. Мой вопрос: это повлечет за собой любые накладные расходы? Если да, то когда и сколько? Могу ли я использовать это, когда производительность абсолютно важна? (Предположим, что я заменил каждое вхождение float64 на scalar и преобразует литералы, например scalar(1.0).)

ответ

10

Прежде всего, нет необходимости переводить литералы. x = 1.0 - это то же, что и x = scalar(1.0), предполагая, что x уже имеет скаляр типа.

В Go нет такой вещи, как пользовательский псевдоним типа. В Go байты и uint8 (которые являются встроенными типами) считаются псевдонимами друг друга. Это два имени для одного и того же типа. Float64 и скаляр не являются одинаковыми. Значения float64 и scalar должны быть преобразованы между собой, используя что-то вроде s = scalar(f), в то время как байт и uint8 этого не делают.

Однако такие преобразования не имеют накладных расходов. Типы применяются во время компиляции для правильности кода, но не влияют на производительность во время выполнения. Выполнение затрагивается только в том случае, если вы делаете утверждения типа или используете отражение. Однако эти различия влияют на логику, а не на производительность.

Могу ли я использовать это, когда производительность абсолютно важна?

Да

+0

Спасибо. Для буквальной вещи я думал больше о 'x: = scalar (1.0)' (или эквивалентно 'var x scalar = 1.0'), чтобы исключить 1.0 из float64. – mk12