Constexpr, wyszukiwanie przez stringa

0

Cześć.
Z tego co rozumiem to w poniższym przykładzie wszystko powinno wykonać się na przy kompilacji i jedyna rzecz runtime to wypisanie true. Patrząc na dump programu to first i second nadal się tam znajduje, co prawda nie jest wykorzystywane nigdzie w kodzie ale jednak tam jest. Jaki jest powód takiego zachowania? Czy da się temu zapobiec? Kompilator to msvc 2017, pełna optymalizacja włączona.

Bez tytułu.png

#include <iostream>

constexpr const char* values[] {
	"first",
	"second"
};

constexpr bool are_strings_equal(const char* first, const char* second) {
	return *first == *second
		&& (*first == '\0' ||
			are_strings_equal(first + 1, second + 1));
}

constexpr bool is_valid_value(const char* key) {
	for (auto element : values)
		if (are_strings_equal(element, key))
			return true;
	return false;
}


int main() {
	constexpr auto exist = is_valid_value("first");
	std::cout << "exist: " << std::boolalpha << exist << std::endl;

	return 0;
}
1

Zobacz, czy jak do tablicy dodasz static zachowanie będzie nadal takie samo. Być może z jakiegoś powodu nie usuwają stringów widocznych z external linkage, nawet jeśli program ma jeden plik.

0

pełna optymalizacja włączona

A link-time code generation?

0

Może po prostu symbole dla debugera? :)

0
kq napisał(a):

Zobacz, czy jak do tablicy dodasz static zachowanie będzie nadal takie samo. Być może z jakiegoś powodu nie usuwają stringów widocznych z external linkage, nawet jeśli program ma jeden plik.

Azarien napisał(a):

A link-time code generation?

Nic to nie daje.

Nie mam pojęcia co jest problemem, ale to bardzo dziwne. W G++ 6.4 domyślnie stringi także zostają, po dodaniu -O3 są usuwane.
W msvc stringi zostają gdy w kodzie znajduje się funkcja is_valid_value, nawet gdy nigdzie nie jest wywoływana, gdy tylko ją zakomentuje znikają.
O co chodzi? xD

#include <iostream>

static constexpr const char* values[] {
	"first",
	"second"
};

constexpr bool are_strings_equal(const char* first, const char* second) {
	return *first == *second
		&& (*first == '\0' ||
			are_strings_equal(first + 1, second + 1));
}

constexpr bool is_valid_value(const char* key) {
	for (auto element : values)
		if (are_strings_equal(element, key))
			return true;
	return false;
}


int main() {
	return 0;
}

Nie ma

#include <iostream>

static constexpr const char* values[] {
	"first",
	"second"
};

constexpr bool are_strings_equal(const char* first, const char* second) {
	return *first == *second
		&& (*first == '\0' ||
			are_strings_equal(first + 1, second + 1));
}

//constexpr bool is_valid_value(const char* key) {
//	for (auto element : values)
//		if (are_strings_equal(element, key))
//			return true;
//	return false;
//}


int main() {
	return 0;
}
1

Po daniu szansy linkerowi by czyścił w g++ 7.1, czyści już przy -O1. Może to Cię naprowadzi bo VS2017 nie mam pod ręką...

g++ -std=c++14 -O1 -fdata-sections -ffunction-sections -c prog.cpp
g++ -Wl,-gc-sections -o prog prog.o
1

up /Ox

0
satirev napisał(a):

up /Ox

Niestety ale to niczego nie zmienia :/

1 użytkowników online, w tym zalogowanych: 0, gości: 1