C оптимизация строковых литералов

только что проверял следующее в gdb:

char *a[] = {"one","two","three","four"};
char *b[] = {"one","two","three","four"};
char *c[] = {"two","three","four","five"};
char *d[] = {"one","three","four","six"};

и я получаю следующее:

(gdb) p a
$17 = {0x80961a4 "one", 0x80961a8 "two", 0x80961ac "three", 0x80961b2 "four"}
(gdb) p b
$18 = {0x80961a4 "one", 0x80961a8 "two", 0x80961ac "three", 0x80961b2 "four"}
(gdb) p c
$19 = {0x80961a8 "two", 0x80961ac "three", 0x80961b2 "four", 0x80961b7 "five"}
(gdb) p d
$20 = {0x80961a4 "one", 0x80961ac "three", 0x80961b2 "four", 0x80961bc "six"}

Я действительно удивлен, что указатели строк одинаковы для эквивалентных слов. Я бы подумал, что каждой строке будет выделена отдельная память в стеке, независимо от того, совпадает ли она со строкой в ​​другом массиве.

Является ли это примером какой-то оптимизации компилятора или это стандартное поведение для объявления строк такого рода?

22
задан legends2k 3 December 2014 в 08:12
поделиться