Ограничить ключевое слово множественной литеральной строкой только для чтения

Может ли 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[],

Другие вопросы по тегам