LINUX.ORG.RU

gcc как одинаковые строки _не_ объединять

 


1

3

gcc обычно объединяет одинаковые строки типа «mystring» в одну, что обычно и надо, но для целей поиска этих дублей строк хочу запретить объединение этих строк даже в пределах одного файла - можно ли ?

★★★★★
Ответ на: комментарий от xaizek

не, в пределах файла он всеже объединяет принудительно сам
пробовал также и -fno-merge-debug-strings

x905 ★★★★★
() автор топика

Ха. это убрали мои знания по С отстали на 100 лет. как я понимаю, уже никак.

-fwritable-strings

отключает _в том числе_ и string pooling , но как я помню ещё чего-то воротит.

vtVitus ★★★★★
()
Последнее исправление: vtVitus (всего исправлений: 2)

Делайте статический/динамический буфер, инициализируйте в рантайме и сравнивайте.

vodz ★★★★★
()
Ответ на: комментарий от vtVitus

-fwritable-strings убрали опцию

x905 ★★★★★
() автор топика
Ответ на: комментарий от anonymous

Сделай неодинаковыми проблем то

задача не в том чтобы сделать их делать неодинаковыми

x905 ★★★★★
() автор топика
Ответ на: комментарий от vodz

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

x905 ★★★★★
() автор топика
Ответ на: комментарий от x905

придется для grep придумать регулярку, что пока вызывает трудности

Оно тебе как бы намекает, чтобы ты не выпендривался, а взял и написал 5 строк на нормальном языке.

anonymous
()
Ответ на: комментарий от anonymous

какие 5 строк написать ?

x905 ★★★★★
() автор топика

Это для теста чтоль надо? Выделите память тогда для них просто. Или создайте на стеке, если они короткоживущие.

Sorcerer ★★★★★
()
Ответ на: комментарий от Sorcerer

обдумываю мысли об оптимизации ...
т.е. мне нужно знать сколько раз в программе используются одинаковые строки
например строка «foo» 5 раз, строка «bar» 2 раза (например она учавствует в выводе на экран)
я не могу «просто» их найти т.к. не знаю их содержимого, их много разных
далее одинаковые строки вынесу в отдельный файл константами, возможно
пока хочу только выяснить: строка - число раз

x905 ★★★★★
() автор топика
Ответ на: комментарий от xaizek

интересно, попробую что получится

x905 ★★★★★
() автор топика
Ответ на: комментарий от x905

«foo\01» «foo\02» «foo\03» «foo\04» Можно вообще макросом делать с именем файла номером строки в конце.

будет «одна и та же» строка «foo», но для gcc они будет разными. Не понимаю правда нах тебе это нужно.

anonymous
()
Ответ на: комментарий от x905

жаль нужен 5й gcc

Скорее всего надо откатить лишь один мелкий коммит: этот. И будет работать на 4.8.4 (может ещё этот). Там совместимость отличная между версиями, только мелочи меняются.

xaizek ★★★★★
()
Последнее исправление: xaizek (всего исправлений: 1)
Ответ на: комментарий от xaizek

плагины «штатным» gcc5 в opensuse почемуто не поддерживаются
соберу сам

x905 ★★★★★
() автор топика

Это можно достаточно эффективно решать простым шелл скриптом (на основе примерно такого)

strip exe_or_so_name
strings exe_or_so_name | grep -v "_Z" \
| while read f;
do count=$(grep -rhI "$f" ..| grep -c -);
if [[ count -ne "0" ]];
then 
    echo == "$f" == $count; 
fi
done
anonymous
()
Ответ на: комментарий от anonymous

скрипт не может этого сделать, со strings я и начал сначала
strings не покажет все вхождения «foobar» т.к. компилятор объединил их в одну
strings не покажет «строки», образованные через например QStringLiteral
strings покажет много лишнего, хотя он бывает и полезен
я пока остановился на указанном выше gcc плагине, вроде он то что нужно

x905 ★★★★★
() автор топика
Ответ на: комментарий от imatveev13

компилятор при том что он компилирует все вхождения одинаковых строк в одну строку, а strings этого не знает

x905 ★★★★★
() автор топика
Ответ на: комментарий от imatveev13

исходные файлы не всегда в одном каталоге
исходные файлы одного каталоге не всегда в проекте
«через» gcc будет правильнее, ведь именно то что он собрал, то и попадает в исполняемый файл

x905 ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.