Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
Под переменную типа string выделяется память размером 12 байт, которая содержит 4 или 8 байт (в зависимости от битности системы) под указатель на строку. Если у строки нет инициализатора, то эти 12 байт по-любому заполняются нулями, независимо глобальная эта переменная или локальная. Таким образом получается неинициализированная строка (та которая ==NULL)
Это информация - служебная. Которую можно иметь в виду, но на которую нельзя закладываться.
То реально под строку выделяется какая-то память при объявлении без инициализации? То есть строка - это какая-то структура/класс или просто буфер, управляемый рантаймом?
Вообще-то самое выгодное по расходу памяти было бы сделать, как в обычных массивах, по крайней мере в С++ это так.
int _tmain(int argc, _TCHAR* argv[])
{
dArr[0] = 1; // сразу же выделяется память 4 Кб, то есть под 512 чисел double
return 0;
}
И так далее, если последовательно заполнять массив, будут выделятся новые куски памяти 4 Кб. Причем память выделяет именно винда, а не код программы.
Кстати, надо и в MQL проверить, так тут или сразу выделяют..
Под переменную типа string выделяется память размером 12 байт, которая содержит 4 или 8 байт (в зависимости от битности системы) под указатель на строку. Если у строки нет инициализатора, то эти 12 байт по-любому заполняются нулями, независимо глобальная эта переменная или локальная. Таким образом получается неинициализированная строка (та которая ==NULL)
Это информация - служебная. Которую можно иметь в виду, но на которую нельзя закладываться.
{
const char *str;
};
bool operator==(const mql_string &lhs, const mql_string &rhs)
{
#define MY_CPMNULL(L, R) \
if(L.str == nullptr) \
{ \
if(R.str == nullptr) \
return true; \
if(strcmp(R.str, "") == 0) \
return true; \
return false; \
}
MY_CPMNULL(lhs, rhs);
MY_CPMNULL(rhs, lhs);
return strcmp(lhs.str, rhs.str) == 0;
#undef MYCPMNULL
}
int main()
{
mql_string s1{nullptr}, s2{""}, s3{"sds"};
cout << boolalpha;
cout << "s1 == s1 " << (s1 == s1) << '\n';
cout << "s1 == s2 " << (s1 == s2) << '\n';
cout << "s1 == s3 " << (s1 == s3) << '\n';
cout << "s2 == s3 " << (s2 == s3) << '\n';
}
$ ./a.out
s1 == s1 true
s1 == s2 true
s1 == s3 false
s2 == s3 false
В мкл оператор член класса, суть не меняет (ну или как у вас строки реализованы, не знаю).
Дефолтная строка должна давать истину при сравнении с "", это логично и общепринято.
А в чем логика?
char *ch1 = 0;
char *ch2 = "";
#endif
Написали когда-то, чтобы не очень огорчать любителей объвить, но не инициализировать :). Верить никому нельзя.
Насчёт инициализации и жизни глобальных переменных получен ответ из Сервисдеск. Недавно, по MQL5, а не по "бесшабашной" четвёрке.
Насчёт инициализации и жизни глобальных переменных получен ответ из Сервисдеск. Недавно, по MQL5, а не по "бесшабашной" четвёрке.
Насчёт инициализации и жизни глобальных переменных получен ответ из Сервисдеск. Недавно, по MQL5, а не по "бесшабашной" четвёрке.
А в чем логика?
char *ch1 = 0;
char *ch2 = "";
#endif
А вы не видите разницы между голым указателем и классом СТРОКА? Строка не может принимать 0, такого состояния она не имеет.
Запустите:
std::string s = 0;
Рассчитывать на значение или поведение "по-умолчанию" - себе дороже :). Но деньги Ваши - можете и дальше верить и объявлять переменные БЕЗ ПРИНУДИТЕЛЬНОЙ инициализации.
Владимир, сознайтесь как на духу - когда спать ложитесь, ставите у кровати два стакана, один с водой, а другой полный, как программист из анекдота? ))
ЗЫ: вообще, с подходом в части MQL5 согласен, нет гарантии, что в очередном билде что-то не порушат. Такое было на моей памяти. Лучше перестраховаться.