Да! GCC делает это на уровне оптимизации -O1
и выше, а clang делает это на уровне оптимизации -O2
и выше.
Я протестировал его, используя этот код:
struct Matrix5x5 {
double values[5][5];
Matrix5x5() : values() {}
double trace() {
double sum = 0.0;
for(int i = 0; i < 5; i++) {
sum += values[i][i];
}
return sum;
}
};
double trace_of(Matrix5x5& m) {
return m.trace();
}
И это сборка, созданная как gcc, так и clang:
trace_of(Matrix5x5&):
pxor xmm0, xmm0
addsd xmm0, QWORD PTR [rdi]
addsd xmm0, QWORD PTR [rdi+48]
addsd xmm0, QWORD PTR [rdi+96]
addsd xmm0, QWORD PTR [rdi+144]
addsd xmm0, QWORD PTR [rdi+192]
ret
Вы можете поиграться с кодом и посмотрите соответствующую сборку здесь: https://godbolt.org/z/p2uF0E .
Если вы перегрузите operator[]
, то вам придется повысить уровень оптимизации до -O3
, но компилятор все равно сделает это: https://godbolt.org/z/JInIME [117 ] [+1112]
(редактирование - я неправильно читал исходный вопрос),
Вы не можете добавить фактические атрибуты (они врезаются в IL); однако, с XmlSerializer
Вы не имеете к - можно предоставить дополнительные атрибуты в конструкторе к XmlSerializer
. Действительно, однако, необходимо немного стараться кэшироваться XmlSerializer
экземпляр, если Вы делаете это, как иначе, это создаст дополнительный блок на экземпляр, который является немного текучим. (это не делает этого при использовании простого конструктора, который просто берет a Type
). Посмотрите на XmlAttributeOverrides
.
Для примера:
using System;
using System.Xml.Serialization;
public class Person
{
static void Main()
{
XmlAttributeOverrides overrides = new XmlAttributeOverrides();
XmlAttributes attribs = new XmlAttributes();
attribs.XmlIgnore = false;
attribs.XmlElements.Add(new XmlElementAttribute("personName"));
overrides.Add(typeof(Person), "Name", attribs);
XmlSerializer ser = new XmlSerializer(typeof(Person), overrides);
Person person = new Person();
person.Name = "Marc";
ser.Serialize(Console.Out, person);
}
private string name;
[XmlElement("name")]
[XmlIgnore]
public string Name { get { return name; } set { name = value; } }
}
Отметьте также; если атрибуты XML были просто иллюстративны, то существует второй способ добавить атрибуты для вещей, связанных с привязкой данных, при помощи TypeDescriptor.CreateProperty
и также ICustomTypeDescriptor
или TypeDescriptionProvider
. Намного более сложный, чем xml случай, я боюсь - и не работаю на весь код - просто кодируют, который использует компонентную модель.
Не возможно добавить/удалить атрибуты от класса во времени выполнения.
Возможно однако обновить способ, которым сериализация XML работает во времени выполнения, не будучи должен отредактировать атрибуты. См. сообщение Marc.
Обновленное РЕДАКТИРОВАНИЕ