Basiert die kleine String-Optimierung von FBString auf undefiniertem Verhalten?

8

Die fbstring_core -Klasse von Facebook verwendet die "Kleine String-Optimierung", die unter diese Diskussion wobei der Speicher für die Datenmitglieder der Klasse - a Char* , size und capacity - Wird zur Speicherung von Zeichendaten verwendet, wenn die Zeichenkette ausreichend klein ist. Die Markierungsbits, die verwendet werden, um zwischen diesen Fällen zu unterscheiden, befinden sich in dem "äußersten rechten Zeichen des Speichers". Meine Frage ist, ob der Zugriff auf diese Bits über das bytes_ -Unionsmitglied, das nie wirklich geschrieben wurde, ein undefiniertes Verhalten nach dem C ++ 11 -Standard darstellt. Die Antwort auf Zugriff auf inaktives Mitglied der Union und undefiniertes Verhalten? schlägt vor es ist.

Der folgende Auszug enthält die Deklaration dieser Elemente und die% member-Funktion category() , mit der festgestellt wird, ob diese Optimierung wirksam ist.

%Vor%

Es scheint, dass diese Implementierung darauf beruht, "type punning" zu verwenden, um auf ein Byte zuzugreifen, das möglicherweise Teil des size_t capacity_ -Members ist. Aus der Antwort auf die Frage, die oben verknüpft ist, stelle ich fest, dass dies ist definiert Verhalten in C99, aber nicht in C ++ 11?

    
DrewBarbs 26.08.2017, 22:29
quelle

1 Antwort

11

Dies scheint nicht nur UB zu sein, es ist auch ziemlich unnötig, weil die einzige Verwendung von bytes_ für das Lesen des letzten Bytes von this zu sein scheint, was ohne UB gemacht werden kann:

%Vor%

Das liegt an der speziellen Ausnahme in C ++, mit der Objekte als char-Arrays neu interpretiert werden können.

    
John Zwinck 27.08.2017, 01:03
quelle