Ограничить ключевое слово множественной литеральной строкой только для чтения
Может ли restrict
ключевое слово будет использоваться, как показано ниже
Интерфейс:
int func(const char * restrict str1, const char * restrict str2);
Вызов:
func("something", "something");
Есть вероятность, что компилятор делает тот же указатель для строкового литерала "something"
оптимизировать след. В таких случаях, str1
а также str2
укажет ту же область.
Это законно?
Ну, я думаю, это нормально, потому что, например, в этом определении:
extern int printf (const char *__restrict __format, ...);
Можно ли использовать как:
printf("%s something", "something");
В этом случае, "something"
может быть сохранен в том же месте в памяти для оптимизации занимаемой площади.
Тем не менее, я должен убедиться, что это безопасно и законно, потому что я хочу сохранить свой исходный код переносимым и легальным.
Если кто-то знает какое-то определение, пожалуйста, научите меня.
Дополнение (20180804 16:07 JST):
Я хочу соответствовать стандарту. если стандарт говорит, что указатель ограничения не должен указывать на один и тот же адрес,
Кейс вызывает функцию как:
func("something", "something"); can be illegal.
потому что компилятор может использовать один и тот же указатель для чего-то.
И незаконный означает, что это поведение кода не определено, может произойти все что угодно.
Таким образом, я могу избежать использования "restrict".
Но я хочу использовать его для создания быстрых программ. И этого будет ожидать:
read-only member with keyword "restrict" can be stored in duplicative area.
Потому что я видел интерфейс для printf(). Если константная строка не может указывать на один и тот же адрес, printf будет бесполезным.
1 ответ
int func(const char * restrict str1, const char * restrict str2);
Любопытный пример.
Без цитирования спецификации C, которая в случае restrict
легко расшифровать, restrict
означает, что данные, на которые указывает func()
или его вызываемые подфункции делают через этот указатель.
В таких случаях str1 и str2 будут указывать на одну и ту же область
Это законно?
Рассматривать str1
а также str2
указывают на то же место и func(g_temp, g_temp);
Звонок не является законным.
char g_temp[100] = "Hello world";
int func(const char * restrict str1, const char * restrict str2) {
g_temp[0]++;
puts(str1);
}
void foo() {
func(g_temp, g_temp);
}
В случае func("something", "something");
все в порядке, так как данные, указанные str1, str2
хотя они могут перекрываться, не меняются из-за func()
,
Дело не в том, что проблема совпадает, это может func1()
полагаться на данные, указанные restrict str1
только изменения из-за доступа с str1
, поскольку str1
указывает на const
данные, func1()
не собирается напрямую менять его и не будет g_temp[0]++;
поскольку "something"
не включает g_temp[]
,