Я получил это предупреждение.Я хотел бы определенного поведения, но я хотел бы сохранить этот код как есть.Когда я могу нарушить правила псевдонимов?
предупреждение: разыменование указателя с типом-наказанием нарушит правила строгого псевдонима [-Wstrict-aliasing]
Строка - моя собственная строка, котораяэто стручокЭтот код вызывается из C. S может быть int.Строка в значительной степени struct String { RealString*s; }
, но шаблонная и вспомогательная функции.Я делаю статическое утверждение, чтобы убедиться, что String является модулем, имеет размер 4 байта, а int равен 4 байта.Я также написал assert, который проверяет, все ли указатели> = NotAPtr.Это в моей новой / Malloc перегрузки.Я могу также включить это утверждение в строку, если вы предложите
Учитывая правила, которым я следую (в основном, строка является модулем и всегда имеет тот же размер, что и int), было бы хорошо, если бы я нарушил правила псевдонимов?Это один из немногих случаев, когда кто-то ломает его правильно?
void func(String s) {
auto v=*(unsigned int*)&s;
myassert(v);
if(v < NotAPtr) {
//v is an int
}
else{
//v is a ptr
}
}