Цпс расход: аналитика, советы, помощь с выбором материалов.

Содержание

аналитика, советы, помощь с выбором материалов.

[Error] 
Maximum function nesting level of '256' reached, aborting! (0)
/home/bitrix/www/bitrix/modules/main/lib/config/option.php:430
#0: Bitrix\Main\Config\Option::getDefaultSite()
	/home/bitrix/www/bitrix/modules/main/lib/config/option.php:43
#1: Bitrix\Main\Config\Option::get(string, string, string, boolean)
	/home/bitrix/www/bitrix/modules/main/classes/general/option.php:30
#2: CAllOption::GetOptionString(string, string, string)
	/home/bitrix/www/bitrix/modules/main/classes/general/main.php:2699
#3: CAllMain->get_cookie(string)
	/home/bitrix/www/bitrix/modules/main/lib/composite/engine.php:1321
#4: Bitrix\Main\Composite\Engine::onEpilog()
	/home/bitrix/www/bitrix/modules/main/classes/general/module.php:480
#5: ExecuteModuleEventEx(array)
	/home/bitrix/www/bitrix/modules/main/tools.php:3880
#6: LocalRedirect(string, string)
	/home/bitrix/www/bitrix/php_interface/init.php:632
#7: CYakusHandlers::OnAfterEpilog()
	/home/bitrix/www/bitrix/modules/main/classes/general/module.php:465
#8: ExecuteModuleEventEx(array)
	/home/bitrix/www/bitrix/modules/main/classes/general/main.php:3487
#9: CAllMain::RunFinalActionsInternal()
	/home/bitrix/www/bitrix/modules/main/lib/application.php:187
#10: Bitrix\Main\Application->terminate(integer)
	/home/bitrix/www/bitrix/modules/main/lib/application.php:174
#11: Bitrix\Main\Application->end()
	/home/bitrix/www/bitrix/modules/main/tools.php:3885
#12: LocalRedirect(string, string)
	/home/bitrix/www/bitrix/php_interface/init.php:632
#13: CYakusHandlers::OnAfterEpilog()
	/home/bitrix/www/bitrix/modules/main/classes/general/module.php:465
#14: ExecuteModuleEventEx(array)
	/home/bitrix/www/bitrix/modules/main/classes/general/main.php:3487
#15: CAllMain::RunFinalActionsInternal()
	/home/bitrix/www/bitrix/modules/main/lib/application.php:187
#16: Bitrix\Main\Application->terminate(integer)
	/home/bitrix/www/bitrix/modules/main/lib/application.php:174
#17: Bitrix\Main\Application->end()
	/home/bitrix/www/bitrix/modules/main/tools. php:3885
#18: LocalRedirect(string, string)
	/home/bitrix/www/bitrix/php_interface/init.php:632
#19: CYakusHandlers::OnAfterEpilog()
	/home/bitrix/www/bitrix/modules/main/classes/general/module.php:465
#20: ExecuteModuleEventEx(array)
	/home/bitrix/www/bitrix/modules/main/classes/general/main.php:3487
#21: CAllMain::RunFinalActionsInternal()
	/home/bitrix/www/bitrix/modules/main/lib/application.php:187
#22: Bitrix\Main\Application->terminate(integer)
	/home/bitrix/www/bitrix/modules/main/lib/application.php:174
#23: Bitrix\Main\Application->end()
	/home/bitrix/www/bitrix/modules/main/tools.php:3885
#24: LocalRedirect(string, string)
	/home/bitrix/www/bitrix/php_interface/init.php:632
#25: CYakusHandlers::OnAfterEpilog()
	/home/bitrix/www/bitrix/modules/main/classes/general/module.php:465
#26: ExecuteModuleEventEx(array)
	/home/bitrix/www/bitrix/modules/main/classes/general/main.php:3487
#27: CAllMain::RunFinalActionsInternal()
	/home/bitrix/www/bitrix/modules/main/lib/application.php:187
#28: Bitrix\Main\Application->terminate(integer)
	/home/bitrix/www/bitrix/modules/main/lib/application.php:174
#29: Bitrix\Main\Application->end()
	/home/bitrix/www/bitrix/modules/main/tools.php:3885
#30: LocalRedirect(string, string)
	/home/bitrix/www/bitrix/php_interface/init.php:632
#31: CYakusHandlers::OnAfterEpilog()
	/home/bitrix/www/bitrix/modules/main/classes/general/module.php:465
#32: ExecuteModuleEventEx(array)
	/home/bitrix/www/bitrix/modules/main/classes/general/main.php:3487
#33: CAllMain::RunFinalActionsInternal()
	/home/bitrix/www/bitrix/modules/main/lib/application.php:187
#34: Bitrix\Main\Application->terminate(integer)
	/home/bitrix/www/bitrix/modules/main/lib/application.php:174
#35: Bitrix\Main\Application->end()
	/home/bitrix/www/bitrix/modules/main/tools.php:3885
#36: LocalRedirect(string, string)
	/home/bitrix/www/bitrix/php_interface/init.php:632
#37: CYakusHandlers::OnAfterEpilog()
	/home/bitrix/www/bitrix/modules/main/classes/general/module. php:465
#38: ExecuteModuleEventEx(array)
	/home/bitrix/www/bitrix/modules/main/classes/general/main.php:3487
#39: CAllMain::RunFinalActionsInternal()
	/home/bitrix/www/bitrix/modules/main/lib/application.php:187
#40: Bitrix\Main\Application->terminate(integer)
	/home/bitrix/www/bitrix/modules/main/lib/application.php:174
#41: Bitrix\Main\Application->end()
	/home/bitrix/www/bitrix/modules/main/tools.php:3885
#42: LocalRedirect(string, string)
	/home/bitrix/www/bitrix/php_interface/init.php:632
#43: CYakusHandlers::OnAfterEpilog()
	/home/bitrix/www/bitrix/modules/main/classes/general/module.php:465
#44: ExecuteModuleEventEx(array)
	/home/bitrix/www/bitrix/modules/main/classes/general/main.php:3487
#45: CAllMain::RunFinalActionsInternal()
	/home/bitrix/www/bitrix/modules/main/lib/application.php:187
#46: Bitrix\Main\Application->terminate(integer)
	/home/bitrix/www/bitrix/modules/main/lib/application.php:174
#47: Bitrix\Main\Application->end()
	/home/bitrix/www/bitrix/modules/main/tools.php:3885
#48: LocalRedirect(string, string)
	/home/bitrix/www/bitrix/php_interface/init.php:632
#49: CYakusHandlers::OnAfterEpilog()
	/home/bitrix/www/bitrix/modules/main/classes/general/module.php:465
#50: ExecuteModuleEventEx(array)
	/home/bitrix/www/bitrix/modules/main/classes/general/main.php:3487
#51: CAllMain::RunFinalActionsInternal()
	/home/bitrix/www/bitrix/modules/main/lib/application.php:187
#52: Bitrix\Main\Application->terminate(integer)
	/home/bitrix/www/bitrix/modules/main/lib/application.php:174
#53: Bitrix\Main\Application->end()
	/home/bitrix/www/bitrix/modules/main/tools.php:3885
#54: LocalRedirect(string, string)
	/home/bitrix/www/bitrix/php_interface/init.php:632
#55: CYakusHandlers::OnAfterEpilog()
	/home/bitrix/www/bitrix/modules/main/classes/general/module.php:465
#56: ExecuteModuleEventEx(array)
	/home/bitrix/www/bitrix/modules/main/classes/general/main.php:3487
#57: CAllMain::RunFinalActionsInternal()
	/home/bitrix/www/bitrix/modules/main/lib/application. php:187
#58: Bitrix\Main\Application->terminate(integer)
	/home/bitrix/www/bitrix/modules/main/lib/application.php:174
#59: Bitrix\Main\Application->end()
	/home/bitrix/www/bitrix/modules/main/tools.php:3885
#60: LocalRedirect(string, string)
	/home/bitrix/www/bitrix/php_interface/init.php:632
#61: CYakusHandlers::OnAfterEpilog()
	/home/bitrix/www/bitrix/modules/main/classes/general/module.php:465
#62: ExecuteModuleEventEx(array)
	/home/bitrix/www/bitrix/modules/main/classes/general/main.php:3487
#63: CAllMain::RunFinalActionsInternal()
	/home/bitrix/www/bitrix/modules/main/lib/application.php:187
#64: Bitrix\Main\Application->terminate(integer)
	/home/bitrix/www/bitrix/modules/main/lib/application.php:174
#65: Bitrix\Main\Application->end()
	/home/bitrix/www/bitrix/modules/main/tools.php:3885
#66: LocalRedirect(string, string)
	/home/bitrix/www/bitrix/php_interface/init.php:632
#67: CYakusHandlers::OnAfterEpilog()
	/home/bitrix/www/bitrix/modules/main/classes/general/module.php:465
#68: ExecuteModuleEventEx(array)
	/home/bitrix/www/bitrix/modules/main/classes/general/main.php:3487
#69: CAllMain::RunFinalActionsInternal()
	/home/bitrix/www/bitrix/modules/main/lib/application.php:187
#70: Bitrix\Main\Application->terminate(integer)
	/home/bitrix/www/bitrix/modules/main/lib/application.php:174
#71: Bitrix\Main\Application->end()
	/home/bitrix/www/bitrix/modules/main/tools.php:3885
#72: LocalRedirect(string, string)
	/home/bitrix/www/bitrix/php_interface/init.php:632
#73: CYakusHandlers::OnAfterEpilog()
	/home/bitrix/www/bitrix/modules/main/classes/general/module.php:465
#74: ExecuteModuleEventEx(array)
	/home/bitrix/www/bitrix/modules/main/classes/general/main.php:3487
#75: CAllMain::RunFinalActionsInternal()
	/home/bitrix/www/bitrix/modules/main/lib/application.php:187
#76: Bitrix\Main\Application->terminate(integer)
	/home/bitrix/www/bitrix/modules/main/lib/application.php:174
#77: Bitrix\Main\Application->end()
	/home/bitrix/www/bitrix/modules/main/tools. php:3885
#78: LocalRedirect(string, string)
	/home/bitrix/www/bitrix/php_interface/init.php:632
#79: CYakusHandlers::OnAfterEpilog()
	/home/bitrix/www/bitrix/modules/main/classes/general/module.php:465
#80: ExecuteModuleEventEx(array)
	/home/bitrix/www/bitrix/modules/main/classes/general/main.php:3487
#81: CAllMain::RunFinalActionsInternal()
	/home/bitrix/www/bitrix/modules/main/lib/application.php:187
#82: Bitrix\Main\Application->terminate(integer)
	/home/bitrix/www/bitrix/modules/main/lib/application.php:174
#83: Bitrix\Main\Application->end()
	/home/bitrix/www/bitrix/modules/main/tools.php:3885
#84: LocalRedirect(string, string)
	/home/bitrix/www/bitrix/php_interface/init.php:632
#85: CYakusHandlers::OnAfterEpilog()
	/home/bitrix/www/bitrix/modules/main/classes/general/module.php:465
#86: ExecuteModuleEventEx(array)
	/home/bitrix/www/bitrix/modules/main/classes/general/main.php:3487
#87: CAllMain::RunFinalActionsInternal()
	/home/bitrix/www/bitrix/modules/main/lib/application.php:187
#88: Bitrix\Main\Application->terminate(integer)
	/home/bitrix/www/bitrix/modules/main/lib/application.php:174
#89: Bitrix\Main\Application->end()
	/home/bitrix/www/bitrix/modules/main/tools.php:3885
#90: LocalRedirect(string, string)
	/home/bitrix/www/bitrix/php_interface/init.php:632
#91: CYakusHandlers::OnAfterEpilog()
	/home/bitrix/www/bitrix/modules/main/classes/general/module.php:465
#92: ExecuteModuleEventEx(array)
	/home/bitrix/www/bitrix/modules/main/classes/general/main.php:3487
#93: CAllMain::RunFinalActionsInternal()
	/home/bitrix/www/bitrix/modules/main/lib/application.php:187
#94: Bitrix\Main\Application->terminate(integer)
	/home/bitrix/www/bitrix/modules/main/lib/application.php:174
#95: Bitrix\Main\Application->end()
	/home/bitrix/www/bitrix/modules/main/tools.php:3885
#96: LocalRedirect(string, string)
	/home/bitrix/www/bitrix/php_interface/init.php:632
#97: CYakusHandlers::OnAfterEpilog()
	/home/bitrix/www/bitrix/modules/main/classes/general/module. php:465
#98: ExecuteModuleEventEx(array)
	/home/bitrix/www/bitrix/modules/main/classes/general/main.php:3487
#99: CAllMain::RunFinalActionsInternal()
	/home/bitrix/www/bitrix/modules/main/lib/application.php:187
#100: Bitrix\Main\Application->terminate(integer)
	/home/bitrix/www/bitrix/modules/main/lib/application.php:174
#101: Bitrix\Main\Application->end()
	/home/bitrix/www/bitrix/modules/main/tools.php:3885
#102: LocalRedirect(string, string)
	/home/bitrix/www/bitrix/php_interface/init.php:632
#103: CYakusHandlers::OnAfterEpilog()
	/home/bitrix/www/bitrix/modules/main/classes/general/module.php:465
#104: ExecuteModuleEventEx(array)
	/home/bitrix/www/bitrix/modules/main/classes/general/main.php:3487
#105: CAllMain::RunFinalActionsInternal()
	/home/bitrix/www/bitrix/modules/main/lib/application.php:187
#106: Bitrix\Main\Application->terminate(integer)
	/home/bitrix/www/bitrix/modules/main/lib/application.php:174
#107: Bitrix\Main\Application->end()
	/home/bitrix/www/bitrix/modules/main/tools.php:3885
#108: LocalRedirect(string, string)
	/home/bitrix/www/bitrix/php_interface/init.php:632
#109: CYakusHandlers::OnAfterEpilog()
	/home/bitrix/www/bitrix/modules/main/classes/general/module.php:465
#110: ExecuteModuleEventEx(array)
	/home/bitrix/www/bitrix/modules/main/classes/general/main.php:3487
#111: CAllMain::RunFinalActionsInternal()
	/home/bitrix/www/bitrix/modules/main/lib/application.php:187
#112: Bitrix\Main\Application->terminate(integer)
	/home/bitrix/www/bitrix/modules/main/lib/application.php:174
#113: Bitrix\Main\Application->end()
	/home/bitrix/www/bitrix/modules/main/tools.php:3885
#114: LocalRedirect(string, string)
	/home/bitrix/www/bitrix/php_interface/init.php:632
#115: CYakusHandlers::OnAfterEpilog()
	/home/bitrix/www/bitrix/modules/main/classes/general/module.php:465
#116: ExecuteModuleEventEx(array)
	/home/bitrix/www/bitrix/modules/main/classes/general/main.php:3487
#117: CAllMain::RunFinalActionsInternal()
	/home/bitrix/www/bitrix/modules/main/lib/application. php:187
#118: Bitrix\Main\Application->terminate(integer)
	/home/bitrix/www/bitrix/modules/main/lib/application.php:174
#119: Bitrix\Main\Application->end()
	/home/bitrix/www/bitrix/modules/main/tools.php:3885
#120: LocalRedirect(string, string)
	/home/bitrix/www/bitrix/php_interface/init.php:632
#121: CYakusHandlers::OnAfterEpilog()
	/home/bitrix/www/bitrix/modules/main/classes/general/module.php:465
#122: ExecuteModuleEventEx(array)
	/home/bitrix/www/bitrix/modules/main/classes/general/main.php:3487
#123: CAllMain::RunFinalActionsInternal()
	/home/bitrix/www/bitrix/modules/main/lib/application.php:187
#124: Bitrix\Main\Application->terminate(integer)
	/home/bitrix/www/bitrix/modules/main/lib/application.php:174
#125: Bitrix\Main\Application->end()
	/home/bitrix/www/bitrix/modules/main/tools.php:3885
#126: LocalRedirect(string, string)
	/home/bitrix/www/bitrix/php_interface/init.php:632
#127: CYakusHandlers::OnAfterEpilog()
	/home/bitrix/www/bitrix/modules/main/classes/general/module.php:465
#128: ExecuteModuleEventEx(array)
	/home/bitrix/www/bitrix/modules/main/classes/general/main.php:3487
#129: CAllMain::RunFinalActionsInternal()
	/home/bitrix/www/bitrix/modules/main/lib/application.php:187
#130: Bitrix\Main\Application->terminate(integer)
	/home/bitrix/www/bitrix/modules/main/lib/application.php:174
#131: Bitrix\Main\Application->end()
	/home/bitrix/www/bitrix/modules/main/tools.php:3885
#132: LocalRedirect(string, string)
	/home/bitrix/www/bitrix/php_interface/init.php:632
#133: CYakusHandlers::OnAfterEpilog()
	/home/bitrix/www/bitrix/modules/main/classes/general/module.php:465
#134: ExecuteModuleEventEx(array)
	/home/bitrix/www/bitrix/modules/main/classes/general/main.php:3487
#135: CAllMain::RunFinalActionsInternal()
	/home/bitrix/www/bitrix/modules/main/lib/application.php:187
#136: Bitrix\Main\Application->terminate(integer)
	/home/bitrix/www/bitrix/modules/main/lib/application.php:174
#137: Bitrix\Main\Application->end()
	/home/bitrix/www/bitrix/modules/main/tools. php:3885
#138: LocalRedirect(string, string)
	/home/bitrix/www/bitrix/php_interface/init.php:632
#139: CYakusHandlers::OnAfterEpilog()
	/home/bitrix/www/bitrix/modules/main/classes/general/module.php:465
#140: ExecuteModuleEventEx(array)
	/home/bitrix/www/bitrix/modules/main/classes/general/main.php:3487
#141: CAllMain::RunFinalActionsInternal()
	/home/bitrix/www/bitrix/modules/main/lib/application.php:187
#142: Bitrix\Main\Application->terminate(integer)
	/home/bitrix/www/bitrix/modules/main/lib/application.php:174
#143: Bitrix\Main\Application->end()
	/home/bitrix/www/bitrix/modules/main/tools.php:3885
#144: LocalRedirect(string, string)
	/home/bitrix/www/bitrix/php_interface/init.php:632
#145: CYakusHandlers::OnAfterEpilog()
	/home/bitrix/www/bitrix/modules/main/classes/general/module.php:465
#146: ExecuteModuleEventEx(array)
	/home/bitrix/www/bitrix/modules/main/classes/general/main.php:3487
#147: CAllMain::RunFinalActionsInternal()
	/home/bitrix/www/bitrix/modules/main/lib/application.php:187
#148: Bitrix\Main\Application->terminate(integer)
	/home/bitrix/www/bitrix/modules/main/lib/application.php:174
#149: Bitrix\Main\Application->end()
	/home/bitrix/www/bitrix/modules/main/tools.php:3885
#150: LocalRedirect(string, string)
	/home/bitrix/www/bitrix/php_interface/init.php:632
#151: CYakusHandlers::OnAfterEpilog()
	/home/bitrix/www/bitrix/modules/main/classes/general/module.php:465
#152: ExecuteModuleEventEx(array)
	/home/bitrix/www/bitrix/modules/main/classes/general/main.php:3487
#153: CAllMain::RunFinalActionsInternal()
	/home/bitrix/www/bitrix/modules/main/lib/application.php:187
#154: Bitrix\Main\Application->terminate(integer)
	/home/bitrix/www/bitrix/modules/main/lib/application.php:174
#155: Bitrix\Main\Application->end()
	/home/bitrix/www/bitrix/modules/main/tools.php:3885
#156: LocalRedirect(string, string)
	/home/bitrix/www/bitrix/php_interface/init.php:632
#157: CYakusHandlers::OnAfterEpilog()
	/home/bitrix/www/bitrix/modules/main/classes/general/module. php:465
#158: ExecuteModuleEventEx(array)
	/home/bitrix/www/bitrix/modules/main/classes/general/main.php:3487
#159: CAllMain::RunFinalActionsInternal()
	/home/bitrix/www/bitrix/modules/main/lib/application.php:187
#160: Bitrix\Main\Application->terminate(integer)
	/home/bitrix/www/bitrix/modules/main/lib/application.php:174
#161: Bitrix\Main\Application->end()
	/home/bitrix/www/bitrix/modules/main/tools.php:3885
#162: LocalRedirect(string, string)
	/home/bitrix/www/bitrix/php_interface/init.php:632
#163: CYakusHandlers::OnAfterEpilog()
	/home/bitrix/www/bitrix/modules/main/classes/general/module.php:465
#164: ExecuteModuleEventEx(array)
	/home/bitrix/www/bitrix/modules/main/classes/general/main.php:3487
#165: CAllMain::RunFinalActionsInternal()
	/home/bitrix/www/bitrix/modules/main/lib/application.php:187
#166: Bitrix\Main\Application->terminate(integer)
	/home/bitrix/www/bitrix/modules/main/lib/application.php:174
#167: Bitrix\Main\Application->end()
	/home/bitrix/www/bitrix/modules/main/tools.php:3885
#168: LocalRedirect(string, string)
	/home/bitrix/www/bitrix/php_interface/init.php:632
#169: CYakusHandlers::OnAfterEpilog()
	/home/bitrix/www/bitrix/modules/main/classes/general/module.php:465
#170: ExecuteModuleEventEx(array)
	/home/bitrix/www/bitrix/modules/main/classes/general/main.php:3487
#171: CAllMain::RunFinalActionsInternal()
	/home/bitrix/www/bitrix/modules/main/lib/application.php:187
#172: Bitrix\Main\Application->terminate(integer)
	/home/bitrix/www/bitrix/modules/main/lib/application.php:174
#173: Bitrix\Main\Application->end()
	/home/bitrix/www/bitrix/modules/main/tools.php:3885
#174: LocalRedirect(string, string)
	/home/bitrix/www/bitrix/php_interface/init.php:632
#175: CYakusHandlers::OnAfterEpilog()
	/home/bitrix/www/bitrix/modules/main/classes/general/module.php:465
#176: ExecuteModuleEventEx(array)
	/home/bitrix/www/bitrix/modules/main/classes/general/main.php:3487
#177: CAllMain::RunFinalActionsInternal()
	/home/bitrix/www/bitrix/modules/main/lib/application. php:187
#178: Bitrix\Main\Application->terminate(integer)
	/home/bitrix/www/bitrix/modules/main/lib/application.php:174
#179: Bitrix\Main\Application->end()
	/home/bitrix/www/bitrix/modules/main/tools.php:3885
#180: LocalRedirect(string, string)
	/home/bitrix/www/bitrix/php_interface/init.php:632
#181: CYakusHandlers::OnAfterEpilog()
	/home/bitrix/www/bitrix/modules/main/classes/general/module.php:465
#182: ExecuteModuleEventEx(array)
	/home/bitrix/www/bitrix/modules/main/classes/general/main.php:3487
#183: CAllMain::RunFinalActionsInternal()
	/home/bitrix/www/bitrix/modules/main/lib/application.php:187
#184: Bitrix\Main\Application->terminate(integer)
	/home/bitrix/www/bitrix/modules/main/lib/application.php:174
#185: Bitrix\Main\Application->end()
	/home/bitrix/www/bitrix/modules/main/tools.php:3885
#186: LocalRedirect(string, string)
	/home/bitrix/www/bitrix/php_interface/init.php:632
#187: CYakusHandlers::OnAfterEpilog()
	/home/bitrix/www/bitrix/modules/main/classes/general/module.php:465
#188: ExecuteModuleEventEx(array)
	/home/bitrix/www/bitrix/modules/main/classes/general/main.php:3487
#189: CAllMain::RunFinalActionsInternal()
	/home/bitrix/www/bitrix/modules/main/lib/application.php:187
#190: Bitrix\Main\Application->terminate(integer)
	/home/bitrix/www/bitrix/modules/main/lib/application.php:174
#191: Bitrix\Main\Application->end()
	/home/bitrix/www/bitrix/modules/main/tools.php:3885
#192: LocalRedirect(string, string)
	/home/bitrix/www/bitrix/php_interface/init.php:632
#193: CYakusHandlers::OnAfterEpilog()
	/home/bitrix/www/bitrix/modules/main/classes/general/module.php:465
#194: ExecuteModuleEventEx(array)
	/home/bitrix/www/bitrix/modules/main/classes/general/main.php:3487
#195: CAllMain::RunFinalActionsInternal()
	/home/bitrix/www/bitrix/modules/main/lib/application.php:187
#196: Bitrix\Main\Application->terminate(integer)
	/home/bitrix/www/bitrix/modules/main/lib/application.php:174
#197: Bitrix\Main\Application->end()
	/home/bitrix/www/bitrix/modules/main/tools. php:3885
#198: LocalRedirect(string, string)
	/home/bitrix/www/bitrix/php_interface/init.php:632
#199: CYakusHandlers::OnAfterEpilog()
	/home/bitrix/www/bitrix/modules/main/classes/general/module.php:465
#200: ExecuteModuleEventEx(array)
	/home/bitrix/www/bitrix/modules/main/classes/general/main.php:3487
#201: CAllMain::RunFinalActionsInternal()
	/home/bitrix/www/bitrix/modules/main/lib/application.php:187
#202: Bitrix\Main\Application->terminate(integer)
	/home/bitrix/www/bitrix/modules/main/lib/application.php:174
#203: Bitrix\Main\Application->end()
	/home/bitrix/www/bitrix/modules/main/tools.php:3885
#204: LocalRedirect(string, string)
	/home/bitrix/www/bitrix/php_interface/init.php:632
#205: CYakusHandlers::OnAfterEpilog()
	/home/bitrix/www/bitrix/modules/main/classes/general/module.php:465
#206: ExecuteModuleEventEx(array)
	/home/bitrix/www/bitrix/modules/main/classes/general/main.php:3487
#207: CAllMain::RunFinalActionsInternal()
	/home/bitrix/www/bitrix/modules/main/lib/application.php:187
#208: Bitrix\Main\Application->terminate(integer)
	/home/bitrix/www/bitrix/modules/main/lib/application.php:174
#209: Bitrix\Main\Application->end()
	/home/bitrix/www/bitrix/modules/main/tools.php:3885
#210: LocalRedirect(string, string)
	/home/bitrix/www/bitrix/php_interface/init.php:632
#211: CYakusHandlers::OnAfterEpilog()
	/home/bitrix/www/bitrix/modules/main/classes/general/module.php:465
#212: ExecuteModuleEventEx(array)
	/home/bitrix/www/bitrix/modules/main/classes/general/main.php:3487
#213: CAllMain::RunFinalActionsInternal()
	/home/bitrix/www/bitrix/modules/main/lib/application.php:187
#214: Bitrix\Main\Application->terminate(integer)
	/home/bitrix/www/bitrix/modules/main/lib/application.php:174
#215: Bitrix\Main\Application->end()
	/home/bitrix/www/bitrix/modules/main/tools.php:3885
#216: LocalRedirect(string, string)
	/home/bitrix/www/bitrix/php_interface/init.php:632
#217: CYakusHandlers::OnAfterEpilog()
	/home/bitrix/www/bitrix/modules/main/classes/general/module. php:465
#218: ExecuteModuleEventEx(array)
	/home/bitrix/www/bitrix/modules/main/classes/general/main.php:3487
#219: CAllMain::RunFinalActionsInternal()
	/home/bitrix/www/bitrix/modules/main/lib/application.php:187
#220: Bitrix\Main\Application->terminate(integer)
	/home/bitrix/www/bitrix/modules/main/lib/application.php:174
#221: Bitrix\Main\Application->end()
	/home/bitrix/www/bitrix/modules/main/tools.php:3885
#222: LocalRedirect(string, string)
	/home/bitrix/www/bitrix/php_interface/init.php:632
#223: CYakusHandlers::OnAfterEpilog()
	/home/bitrix/www/bitrix/modules/main/classes/general/module.php:465
#224: ExecuteModuleEventEx(array)
	/home/bitrix/www/bitrix/modules/main/classes/general/main.php:3487
#225: CAllMain::RunFinalActionsInternal()
	/home/bitrix/www/bitrix/modules/main/lib/application.php:187
#226: Bitrix\Main\Application->terminate(integer)
	/home/bitrix/www/bitrix/modules/main/lib/application.php:174
#227: Bitrix\Main\Application->end()
	/home/bitrix/www/bitrix/modules/main/tools.php:3885
#228: LocalRedirect(string, string)
	/home/bitrix/www/bitrix/php_interface/init.php:632
#229: CYakusHandlers::OnAfterEpilog()
	/home/bitrix/www/bitrix/modules/main/classes/general/module.php:465
#230: ExecuteModuleEventEx(array)
	/home/bitrix/www/bitrix/modules/main/classes/general/main.php:3487
#231: CAllMain::RunFinalActionsInternal()
	/home/bitrix/www/bitrix/modules/main/lib/application.php:187
#232: Bitrix\Main\Application->terminate(integer)
	/home/bitrix/www/bitrix/modules/main/lib/application.php:174
#233: Bitrix\Main\Application->end()
	/home/bitrix/www/bitrix/modules/main/tools.php:3885
#234: LocalRedirect(string, string)
	/home/bitrix/www/bitrix/php_interface/init.php:632
#235: CYakusHandlers::OnAfterEpilog()
	/home/bitrix/www/bitrix/modules/main/classes/general/module.php:465
#236: ExecuteModuleEventEx(array)
	/home/bitrix/www/bitrix/modules/main/classes/general/main.php:3487
#237: CAllMain::RunFinalActionsInternal()
	/home/bitrix/www/bitrix/modules/main/lib/application. php:187
#238: Bitrix\Main\Application->terminate(integer)
	/home/bitrix/www/bitrix/modules/main/lib/application.php:174
#239: Bitrix\Main\Application->end()
	/home/bitrix/www/bitrix/modules/main/tools.php:3885
#240: LocalRedirect(string, string)
	/home/bitrix/www/bitrix/php_interface/init.php:632
#241: CYakusHandlers::OnAfterEpilog()
	/home/bitrix/www/bitrix/modules/main/classes/general/module.php:465
#242: ExecuteModuleEventEx(array)
	/home/bitrix/www/bitrix/modules/main/classes/general/main.php:3487
#243: CAllMain::RunFinalActionsInternal()
	/home/bitrix/www/bitrix/modules/main/classes/general/main.php:3465
#244: CAllMain::FinalActions(string)
	/home/bitrix/www/bitrix/modules/main/include/epilog_after.php:54
#245: require(string)
	/home/bitrix/www/bitrix/modules/main/include/epilog.php:3
#246: require_once(string)
	/home/bitrix/www/bitrix/footer.php:4
#247: require(string)
	/home/bitrix/www/404.php:53
#248: require(string)
	/home/bitrix/www/bitrix/modules/iblock/lib/component/tools.php:66
#249: Bitrix\Iblock\Component\Tools::process404(string, boolean, boolean, boolean, string)
	/home/bitrix/www/bitrix/components/bitrix/news/component.php:145
#250: include(string)
	/home/bitrix/www/bitrix/modules/main/classes/general/component.php:605
#251: CBitrixComponent->__includeComponent()
	/home/bitrix/www/bitrix/modules/main/classes/general/component.php:680
#252: CBitrixComponent->includeComponent(string, array, boolean, boolean)
	/home/bitrix/www/bitrix/modules/main/classes/general/main.php:1039
#253: CAllMain->IncludeComponent(string, string, array, boolean)
	/home/bitrix/www/articles/index.php:132
#254: include_once(string)
	/home/bitrix/www/bitrix/modules/main/include/urlrewrite.php:159
#255: include_once(string)
	/home/bitrix/www/bitrix/urlrewrite.php:2

аналитика, советы, помощь с выбором материалов.

[Error] 
Maximum function nesting level of '256' reached, aborting! (0)
/home/bitrix/www/bitrix/modules/main/lib/config/option.php:430
#0: Bitrix\Main\Config\Option::getDefaultSite()
	/home/bitrix/www/bitrix/modules/main/lib/config/option. php:43
#1: Bitrix\Main\Config\Option::get(string, string, string, boolean)
	/home/bitrix/www/bitrix/modules/main/classes/general/option.php:30
#2: CAllOption::GetOptionString(string, string, string)
	/home/bitrix/www/bitrix/modules/main/classes/general/main.php:2699
#3: CAllMain->get_cookie(string)
	/home/bitrix/www/bitrix/modules/main/lib/composite/engine.php:1321
#4: Bitrix\Main\Composite\Engine::onEpilog()
	/home/bitrix/www/bitrix/modules/main/classes/general/module.php:480
#5: ExecuteModuleEventEx(array)
	/home/bitrix/www/bitrix/modules/main/tools.php:3880
#6: LocalRedirect(string, string)
	/home/bitrix/www/bitrix/php_interface/init.php:632
#7: CYakusHandlers::OnAfterEpilog()
	/home/bitrix/www/bitrix/modules/main/classes/general/module.php:465
#8: ExecuteModuleEventEx(array)
	/home/bitrix/www/bitrix/modules/main/classes/general/main.php:3487
#9: CAllMain::RunFinalActionsInternal()
	/home/bitrix/www/bitrix/modules/main/lib/application.php:187
#10: Bitrix\Main\Application->terminate(integer)
	/home/bitrix/www/bitrix/modules/main/lib/application.php:174
#11: Bitrix\Main\Application->end()
	/home/bitrix/www/bitrix/modules/main/tools.php:3885
#12: LocalRedirect(string, string)
	/home/bitrix/www/bitrix/php_interface/init.php:632
#13: CYakusHandlers::OnAfterEpilog()
	/home/bitrix/www/bitrix/modules/main/classes/general/module.php:465
#14: ExecuteModuleEventEx(array)
	/home/bitrix/www/bitrix/modules/main/classes/general/main.php:3487
#15: CAllMain::RunFinalActionsInternal()
	/home/bitrix/www/bitrix/modules/main/lib/application.php:187
#16: Bitrix\Main\Application->terminate(integer)
	/home/bitrix/www/bitrix/modules/main/lib/application.php:174
#17: Bitrix\Main\Application->end()
	/home/bitrix/www/bitrix/modules/main/tools.php:3885
#18: LocalRedirect(string, string)
	/home/bitrix/www/bitrix/php_interface/init.php:632
#19: CYakusHandlers::OnAfterEpilog()
	/home/bitrix/www/bitrix/modules/main/classes/general/module.php:465
#20: ExecuteModuleEventEx(array)
	/home/bitrix/www/bitrix/modules/main/classes/general/main. php:3487
#21: CAllMain::RunFinalActionsInternal()
	/home/bitrix/www/bitrix/modules/main/lib/application.php:187
#22: Bitrix\Main\Application->terminate(integer)
	/home/bitrix/www/bitrix/modules/main/lib/application.php:174
#23: Bitrix\Main\Application->end()
	/home/bitrix/www/bitrix/modules/main/tools.php:3885
#24: LocalRedirect(string, string)
	/home/bitrix/www/bitrix/php_interface/init.php:632
#25: CYakusHandlers::OnAfterEpilog()
	/home/bitrix/www/bitrix/modules/main/classes/general/module.php:465
#26: ExecuteModuleEventEx(array)
	/home/bitrix/www/bitrix/modules/main/classes/general/main.php:3487
#27: CAllMain::RunFinalActionsInternal()
	/home/bitrix/www/bitrix/modules/main/lib/application.php:187
#28: Bitrix\Main\Application->terminate(integer)
	/home/bitrix/www/bitrix/modules/main/lib/application.php:174
#29: Bitrix\Main\Application->end()
	/home/bitrix/www/bitrix/modules/main/tools.php:3885
#30: LocalRedirect(string, string)
	/home/bitrix/www/bitrix/php_interface/init.php:632
#31: CYakusHandlers::OnAfterEpilog()
	/home/bitrix/www/bitrix/modules/main/classes/general/module.php:465
#32: ExecuteModuleEventEx(array)
	/home/bitrix/www/bitrix/modules/main/classes/general/main.php:3487
#33: CAllMain::RunFinalActionsInternal()
	/home/bitrix/www/bitrix/modules/main/lib/application.php:187
#34: Bitrix\Main\Application->terminate(integer)
	/home/bitrix/www/bitrix/modules/main/lib/application.php:174
#35: Bitrix\Main\Application->end()
	/home/bitrix/www/bitrix/modules/main/tools.php:3885
#36: LocalRedirect(string, string)
	/home/bitrix/www/bitrix/php_interface/init.php:632
#37: CYakusHandlers::OnAfterEpilog()
	/home/bitrix/www/bitrix/modules/main/classes/general/module.php:465
#38: ExecuteModuleEventEx(array)
	/home/bitrix/www/bitrix/modules/main/classes/general/main.php:3487
#39: CAllMain::RunFinalActionsInternal()
	/home/bitrix/www/bitrix/modules/main/lib/application.php:187
#40: Bitrix\Main\Application->terminate(integer)
	/home/bitrix/www/bitrix/modules/main/lib/application. php:174
#41: Bitrix\Main\Application->end()
	/home/bitrix/www/bitrix/modules/main/tools.php:3885
#42: LocalRedirect(string, string)
	/home/bitrix/www/bitrix/php_interface/init.php:632
#43: CYakusHandlers::OnAfterEpilog()
	/home/bitrix/www/bitrix/modules/main/classes/general/module.php:465
#44: ExecuteModuleEventEx(array)
	/home/bitrix/www/bitrix/modules/main/classes/general/main.php:3487
#45: CAllMain::RunFinalActionsInternal()
	/home/bitrix/www/bitrix/modules/main/lib/application.php:187
#46: Bitrix\Main\Application->terminate(integer)
	/home/bitrix/www/bitrix/modules/main/lib/application.php:174
#47: Bitrix\Main\Application->end()
	/home/bitrix/www/bitrix/modules/main/tools.php:3885
#48: LocalRedirect(string, string)
	/home/bitrix/www/bitrix/php_interface/init.php:632
#49: CYakusHandlers::OnAfterEpilog()
	/home/bitrix/www/bitrix/modules/main/classes/general/module.php:465
#50: ExecuteModuleEventEx(array)
	/home/bitrix/www/bitrix/modules/main/classes/general/main.php:3487
#51: CAllMain::RunFinalActionsInternal()
	/home/bitrix/www/bitrix/modules/main/lib/application.php:187
#52: Bitrix\Main\Application->terminate(integer)
	/home/bitrix/www/bitrix/modules/main/lib/application.php:174
#53: Bitrix\Main\Application->end()
	/home/bitrix/www/bitrix/modules/main/tools.php:3885
#54: LocalRedirect(string, string)
	/home/bitrix/www/bitrix/php_interface/init.php:632
#55: CYakusHandlers::OnAfterEpilog()
	/home/bitrix/www/bitrix/modules/main/classes/general/module.php:465
#56: ExecuteModuleEventEx(array)
	/home/bitrix/www/bitrix/modules/main/classes/general/main.php:3487
#57: CAllMain::RunFinalActionsInternal()
	/home/bitrix/www/bitrix/modules/main/lib/application.php:187
#58: Bitrix\Main\Application->terminate(integer)
	/home/bitrix/www/bitrix/modules/main/lib/application.php:174
#59: Bitrix\Main\Application->end()
	/home/bitrix/www/bitrix/modules/main/tools.php:3885
#60: LocalRedirect(string, string)
	/home/bitrix/www/bitrix/php_interface/init.php:632
#61: CYakusHandlers::OnAfterEpilog()
	/home/bitrix/www/bitrix/modules/main/classes/general/module. php:465
#62: ExecuteModuleEventEx(array)
	/home/bitrix/www/bitrix/modules/main/classes/general/main.php:3487
#63: CAllMain::RunFinalActionsInternal()
	/home/bitrix/www/bitrix/modules/main/lib/application.php:187
#64: Bitrix\Main\Application->terminate(integer)
	/home/bitrix/www/bitrix/modules/main/lib/application.php:174
#65: Bitrix\Main\Application->end()
	/home/bitrix/www/bitrix/modules/main/tools.php:3885
#66: LocalRedirect(string, string)
	/home/bitrix/www/bitrix/php_interface/init.php:632
#67: CYakusHandlers::OnAfterEpilog()
	/home/bitrix/www/bitrix/modules/main/classes/general/module.php:465
#68: ExecuteModuleEventEx(array)
	/home/bitrix/www/bitrix/modules/main/classes/general/main.php:3487
#69: CAllMain::RunFinalActionsInternal()
	/home/bitrix/www/bitrix/modules/main/lib/application.php:187
#70: Bitrix\Main\Application->terminate(integer)
	/home/bitrix/www/bitrix/modules/main/lib/application.php:174
#71: Bitrix\Main\Application->end()
	/home/bitrix/www/bitrix/modules/main/tools.php:3885
#72: LocalRedirect(string, string)
	/home/bitrix/www/bitrix/php_interface/init.php:632
#73: CYakusHandlers::OnAfterEpilog()
	/home/bitrix/www/bitrix/modules/main/classes/general/module.php:465
#74: ExecuteModuleEventEx(array)
	/home/bitrix/www/bitrix/modules/main/classes/general/main.php:3487
#75: CAllMain::RunFinalActionsInternal()
	/home/bitrix/www/bitrix/modules/main/lib/application.php:187
#76: Bitrix\Main\Application->terminate(integer)
	/home/bitrix/www/bitrix/modules/main/lib/application.php:174
#77: Bitrix\Main\Application->end()
	/home/bitrix/www/bitrix/modules/main/tools.php:3885
#78: LocalRedirect(string, string)
	/home/bitrix/www/bitrix/php_interface/init.php:632
#79: CYakusHandlers::OnAfterEpilog()
	/home/bitrix/www/bitrix/modules/main/classes/general/module.php:465
#80: ExecuteModuleEventEx(array)
	/home/bitrix/www/bitrix/modules/main/classes/general/main.php:3487
#81: CAllMain::RunFinalActionsInternal()
	/home/bitrix/www/bitrix/modules/main/lib/application. php:187
#82: Bitrix\Main\Application->terminate(integer)
	/home/bitrix/www/bitrix/modules/main/lib/application.php:174
#83: Bitrix\Main\Application->end()
	/home/bitrix/www/bitrix/modules/main/tools.php:3885
#84: LocalRedirect(string, string)
	/home/bitrix/www/bitrix/php_interface/init.php:632
#85: CYakusHandlers::OnAfterEpilog()
	/home/bitrix/www/bitrix/modules/main/classes/general/module.php:465
#86: ExecuteModuleEventEx(array)
	/home/bitrix/www/bitrix/modules/main/classes/general/main.php:3487
#87: CAllMain::RunFinalActionsInternal()
	/home/bitrix/www/bitrix/modules/main/lib/application.php:187
#88: Bitrix\Main\Application->terminate(integer)
	/home/bitrix/www/bitrix/modules/main/lib/application.php:174
#89: Bitrix\Main\Application->end()
	/home/bitrix/www/bitrix/modules/main/tools.php:3885
#90: LocalRedirect(string, string)
	/home/bitrix/www/bitrix/php_interface/init.php:632
#91: CYakusHandlers::OnAfterEpilog()
	/home/bitrix/www/bitrix/modules/main/classes/general/module.php:465
#92: ExecuteModuleEventEx(array)
	/home/bitrix/www/bitrix/modules/main/classes/general/main.php:3487
#93: CAllMain::RunFinalActionsInternal()
	/home/bitrix/www/bitrix/modules/main/lib/application.php:187
#94: Bitrix\Main\Application->terminate(integer)
	/home/bitrix/www/bitrix/modules/main/lib/application.php:174
#95: Bitrix\Main\Application->end()
	/home/bitrix/www/bitrix/modules/main/tools.php:3885
#96: LocalRedirect(string, string)
	/home/bitrix/www/bitrix/php_interface/init.php:632
#97: CYakusHandlers::OnAfterEpilog()
	/home/bitrix/www/bitrix/modules/main/classes/general/module.php:465
#98: ExecuteModuleEventEx(array)
	/home/bitrix/www/bitrix/modules/main/classes/general/main.php:3487
#99: CAllMain::RunFinalActionsInternal()
	/home/bitrix/www/bitrix/modules/main/lib/application.php:187
#100: Bitrix\Main\Application->terminate(integer)
	/home/bitrix/www/bitrix/modules/main/lib/application.php:174
#101: Bitrix\Main\Application->end()
	/home/bitrix/www/bitrix/modules/main/tools. php:3885
#102: LocalRedirect(string, string)
	/home/bitrix/www/bitrix/php_interface/init.php:632
#103: CYakusHandlers::OnAfterEpilog()
	/home/bitrix/www/bitrix/modules/main/classes/general/module.php:465
#104: ExecuteModuleEventEx(array)
	/home/bitrix/www/bitrix/modules/main/classes/general/main.php:3487
#105: CAllMain::RunFinalActionsInternal()
	/home/bitrix/www/bitrix/modules/main/lib/application.php:187
#106: Bitrix\Main\Application->terminate(integer)
	/home/bitrix/www/bitrix/modules/main/lib/application.php:174
#107: Bitrix\Main\Application->end()
	/home/bitrix/www/bitrix/modules/main/tools.php:3885
#108: LocalRedirect(string, string)
	/home/bitrix/www/bitrix/php_interface/init.php:632
#109: CYakusHandlers::OnAfterEpilog()
	/home/bitrix/www/bitrix/modules/main/classes/general/module.php:465
#110: ExecuteModuleEventEx(array)
	/home/bitrix/www/bitrix/modules/main/classes/general/main.php:3487
#111: CAllMain::RunFinalActionsInternal()
	/home/bitrix/www/bitrix/modules/main/lib/application.php:187
#112: Bitrix\Main\Application->terminate(integer)
	/home/bitrix/www/bitrix/modules/main/lib/application.php:174
#113: Bitrix\Main\Application->end()
	/home/bitrix/www/bitrix/modules/main/tools.php:3885
#114: LocalRedirect(string, string)
	/home/bitrix/www/bitrix/php_interface/init.php:632
#115: CYakusHandlers::OnAfterEpilog()
	/home/bitrix/www/bitrix/modules/main/classes/general/module.php:465
#116: ExecuteModuleEventEx(array)
	/home/bitrix/www/bitrix/modules/main/classes/general/main.php:3487
#117: CAllMain::RunFinalActionsInternal()
	/home/bitrix/www/bitrix/modules/main/lib/application.php:187
#118: Bitrix\Main\Application->terminate(integer)
	/home/bitrix/www/bitrix/modules/main/lib/application.php:174
#119: Bitrix\Main\Application->end()
	/home/bitrix/www/bitrix/modules/main/tools.php:3885
#120: LocalRedirect(string, string)
	/home/bitrix/www/bitrix/php_interface/init.php:632
#121: CYakusHandlers::OnAfterEpilog()
	/home/bitrix/www/bitrix/modules/main/classes/general/module. php:465
#122: ExecuteModuleEventEx(array)
	/home/bitrix/www/bitrix/modules/main/classes/general/main.php:3487
#123: CAllMain::RunFinalActionsInternal()
	/home/bitrix/www/bitrix/modules/main/lib/application.php:187
#124: Bitrix\Main\Application->terminate(integer)
	/home/bitrix/www/bitrix/modules/main/lib/application.php:174
#125: Bitrix\Main\Application->end()
	/home/bitrix/www/bitrix/modules/main/tools.php:3885
#126: LocalRedirect(string, string)
	/home/bitrix/www/bitrix/php_interface/init.php:632
#127: CYakusHandlers::OnAfterEpilog()
	/home/bitrix/www/bitrix/modules/main/classes/general/module.php:465
#128: ExecuteModuleEventEx(array)
	/home/bitrix/www/bitrix/modules/main/classes/general/main.php:3487
#129: CAllMain::RunFinalActionsInternal()
	/home/bitrix/www/bitrix/modules/main/lib/application.php:187
#130: Bitrix\Main\Application->terminate(integer)
	/home/bitrix/www/bitrix/modules/main/lib/application.php:174
#131: Bitrix\Main\Application->end()
	/home/bitrix/www/bitrix/modules/main/tools.php:3885
#132: LocalRedirect(string, string)
	/home/bitrix/www/bitrix/php_interface/init.php:632
#133: CYakusHandlers::OnAfterEpilog()
	/home/bitrix/www/bitrix/modules/main/classes/general/module.php:465
#134: ExecuteModuleEventEx(array)
	/home/bitrix/www/bitrix/modules/main/classes/general/main.php:3487
#135: CAllMain::RunFinalActionsInternal()
	/home/bitrix/www/bitrix/modules/main/lib/application.php:187
#136: Bitrix\Main\Application->terminate(integer)
	/home/bitrix/www/bitrix/modules/main/lib/application.php:174
#137: Bitrix\Main\Application->end()
	/home/bitrix/www/bitrix/modules/main/tools.php:3885
#138: LocalRedirect(string, string)
	/home/bitrix/www/bitrix/php_interface/init.php:632
#139: CYakusHandlers::OnAfterEpilog()
	/home/bitrix/www/bitrix/modules/main/classes/general/module.php:465
#140: ExecuteModuleEventEx(array)
	/home/bitrix/www/bitrix/modules/main/classes/general/main.php:3487
#141: CAllMain::RunFinalActionsInternal()
	/home/bitrix/www/bitrix/modules/main/lib/application. php:187
#142: Bitrix\Main\Application->terminate(integer)
	/home/bitrix/www/bitrix/modules/main/lib/application.php:174
#143: Bitrix\Main\Application->end()
	/home/bitrix/www/bitrix/modules/main/tools.php:3885
#144: LocalRedirect(string, string)
	/home/bitrix/www/bitrix/php_interface/init.php:632
#145: CYakusHandlers::OnAfterEpilog()
	/home/bitrix/www/bitrix/modules/main/classes/general/module.php:465
#146: ExecuteModuleEventEx(array)
	/home/bitrix/www/bitrix/modules/main/classes/general/main.php:3487
#147: CAllMain::RunFinalActionsInternal()
	/home/bitrix/www/bitrix/modules/main/lib/application.php:187
#148: Bitrix\Main\Application->terminate(integer)
	/home/bitrix/www/bitrix/modules/main/lib/application.php:174
#149: Bitrix\Main\Application->end()
	/home/bitrix/www/bitrix/modules/main/tools.php:3885
#150: LocalRedirect(string, string)
	/home/bitrix/www/bitrix/php_interface/init.php:632
#151: CYakusHandlers::OnAfterEpilog()
	/home/bitrix/www/bitrix/modules/main/classes/general/module.php:465
#152: ExecuteModuleEventEx(array)
	/home/bitrix/www/bitrix/modules/main/classes/general/main.php:3487
#153: CAllMain::RunFinalActionsInternal()
	/home/bitrix/www/bitrix/modules/main/lib/application.php:187
#154: Bitrix\Main\Application->terminate(integer)
	/home/bitrix/www/bitrix/modules/main/lib/application.php:174
#155: Bitrix\Main\Application->end()
	/home/bitrix/www/bitrix/modules/main/tools.php:3885
#156: LocalRedirect(string, string)
	/home/bitrix/www/bitrix/php_interface/init.php:632
#157: CYakusHandlers::OnAfterEpilog()
	/home/bitrix/www/bitrix/modules/main/classes/general/module.php:465
#158: ExecuteModuleEventEx(array)
	/home/bitrix/www/bitrix/modules/main/classes/general/main.php:3487
#159: CAllMain::RunFinalActionsInternal()
	/home/bitrix/www/bitrix/modules/main/lib/application.php:187
#160: Bitrix\Main\Application->terminate(integer)
	/home/bitrix/www/bitrix/modules/main/lib/application.php:174
#161: Bitrix\Main\Application->end()
	/home/bitrix/www/bitrix/modules/main/tools. php:3885
#162: LocalRedirect(string, string)
	/home/bitrix/www/bitrix/php_interface/init.php:632
#163: CYakusHandlers::OnAfterEpilog()
	/home/bitrix/www/bitrix/modules/main/classes/general/module.php:465
#164: ExecuteModuleEventEx(array)
	/home/bitrix/www/bitrix/modules/main/classes/general/main.php:3487
#165: CAllMain::RunFinalActionsInternal()
	/home/bitrix/www/bitrix/modules/main/lib/application.php:187
#166: Bitrix\Main\Application->terminate(integer)
	/home/bitrix/www/bitrix/modules/main/lib/application.php:174
#167: Bitrix\Main\Application->end()
	/home/bitrix/www/bitrix/modules/main/tools.php:3885
#168: LocalRedirect(string, string)
	/home/bitrix/www/bitrix/php_interface/init.php:632
#169: CYakusHandlers::OnAfterEpilog()
	/home/bitrix/www/bitrix/modules/main/classes/general/module.php:465
#170: ExecuteModuleEventEx(array)
	/home/bitrix/www/bitrix/modules/main/classes/general/main.php:3487
#171: CAllMain::RunFinalActionsInternal()
	/home/bitrix/www/bitrix/modules/main/lib/application.php:187
#172: Bitrix\Main\Application->terminate(integer)
	/home/bitrix/www/bitrix/modules/main/lib/application.php:174
#173: Bitrix\Main\Application->end()
	/home/bitrix/www/bitrix/modules/main/tools.php:3885
#174: LocalRedirect(string, string)
	/home/bitrix/www/bitrix/php_interface/init.php:632
#175: CYakusHandlers::OnAfterEpilog()
	/home/bitrix/www/bitrix/modules/main/classes/general/module.php:465
#176: ExecuteModuleEventEx(array)
	/home/bitrix/www/bitrix/modules/main/classes/general/main.php:3487
#177: CAllMain::RunFinalActionsInternal()
	/home/bitrix/www/bitrix/modules/main/lib/application.php:187
#178: Bitrix\Main\Application->terminate(integer)
	/home/bitrix/www/bitrix/modules/main/lib/application.php:174
#179: Bitrix\Main\Application->end()
	/home/bitrix/www/bitrix/modules/main/tools.php:3885
#180: LocalRedirect(string, string)
	/home/bitrix/www/bitrix/php_interface/init.php:632
#181: CYakusHandlers::OnAfterEpilog()
	/home/bitrix/www/bitrix/modules/main/classes/general/module. php:465
#182: ExecuteModuleEventEx(array)
	/home/bitrix/www/bitrix/modules/main/classes/general/main.php:3487
#183: CAllMain::RunFinalActionsInternal()
	/home/bitrix/www/bitrix/modules/main/lib/application.php:187
#184: Bitrix\Main\Application->terminate(integer)
	/home/bitrix/www/bitrix/modules/main/lib/application.php:174
#185: Bitrix\Main\Application->end()
	/home/bitrix/www/bitrix/modules/main/tools.php:3885
#186: LocalRedirect(string, string)
	/home/bitrix/www/bitrix/php_interface/init.php:632
#187: CYakusHandlers::OnAfterEpilog()
	/home/bitrix/www/bitrix/modules/main/classes/general/module.php:465
#188: ExecuteModuleEventEx(array)
	/home/bitrix/www/bitrix/modules/main/classes/general/main.php:3487
#189: CAllMain::RunFinalActionsInternal()
	/home/bitrix/www/bitrix/modules/main/lib/application.php:187
#190: Bitrix\Main\Application->terminate(integer)
	/home/bitrix/www/bitrix/modules/main/lib/application.php:174
#191: Bitrix\Main\Application->end()
	/home/bitrix/www/bitrix/modules/main/tools.php:3885
#192: LocalRedirect(string, string)
	/home/bitrix/www/bitrix/php_interface/init.php:632
#193: CYakusHandlers::OnAfterEpilog()
	/home/bitrix/www/bitrix/modules/main/classes/general/module.php:465
#194: ExecuteModuleEventEx(array)
	/home/bitrix/www/bitrix/modules/main/classes/general/main.php:3487
#195: CAllMain::RunFinalActionsInternal()
	/home/bitrix/www/bitrix/modules/main/lib/application.php:187
#196: Bitrix\Main\Application->terminate(integer)
	/home/bitrix/www/bitrix/modules/main/lib/application.php:174
#197: Bitrix\Main\Application->end()
	/home/bitrix/www/bitrix/modules/main/tools.php:3885
#198: LocalRedirect(string, string)
	/home/bitrix/www/bitrix/php_interface/init.php:632
#199: CYakusHandlers::OnAfterEpilog()
	/home/bitrix/www/bitrix/modules/main/classes/general/module.php:465
#200: ExecuteModuleEventEx(array)
	/home/bitrix/www/bitrix/modules/main/classes/general/main.php:3487
#201: CAllMain::RunFinalActionsInternal()
	/home/bitrix/www/bitrix/modules/main/lib/application. php:187
#202: Bitrix\Main\Application->terminate(integer)
	/home/bitrix/www/bitrix/modules/main/lib/application.php:174
#203: Bitrix\Main\Application->end()
	/home/bitrix/www/bitrix/modules/main/tools.php:3885
#204: LocalRedirect(string, string)
	/home/bitrix/www/bitrix/php_interface/init.php:632
#205: CYakusHandlers::OnAfterEpilog()
	/home/bitrix/www/bitrix/modules/main/classes/general/module.php:465
#206: ExecuteModuleEventEx(array)
	/home/bitrix/www/bitrix/modules/main/classes/general/main.php:3487
#207: CAllMain::RunFinalActionsInternal()
	/home/bitrix/www/bitrix/modules/main/lib/application.php:187
#208: Bitrix\Main\Application->terminate(integer)
	/home/bitrix/www/bitrix/modules/main/lib/application.php:174
#209: Bitrix\Main\Application->end()
	/home/bitrix/www/bitrix/modules/main/tools.php:3885
#210: LocalRedirect(string, string)
	/home/bitrix/www/bitrix/php_interface/init.php:632
#211: CYakusHandlers::OnAfterEpilog()
	/home/bitrix/www/bitrix/modules/main/classes/general/module.php:465
#212: ExecuteModuleEventEx(array)
	/home/bitrix/www/bitrix/modules/main/classes/general/main.php:3487
#213: CAllMain::RunFinalActionsInternal()
	/home/bitrix/www/bitrix/modules/main/lib/application.php:187
#214: Bitrix\Main\Application->terminate(integer)
	/home/bitrix/www/bitrix/modules/main/lib/application.php:174
#215: Bitrix\Main\Application->end()
	/home/bitrix/www/bitrix/modules/main/tools.php:3885
#216: LocalRedirect(string, string)
	/home/bitrix/www/bitrix/php_interface/init.php:632
#217: CYakusHandlers::OnAfterEpilog()
	/home/bitrix/www/bitrix/modules/main/classes/general/module.php:465
#218: ExecuteModuleEventEx(array)
	/home/bitrix/www/bitrix/modules/main/classes/general/main.php:3487
#219: CAllMain::RunFinalActionsInternal()
	/home/bitrix/www/bitrix/modules/main/lib/application.php:187
#220: Bitrix\Main\Application->terminate(integer)
	/home/bitrix/www/bitrix/modules/main/lib/application.php:174
#221: Bitrix\Main\Application->end()
	/home/bitrix/www/bitrix/modules/main/tools. php:3885
#222: LocalRedirect(string, string)
	/home/bitrix/www/bitrix/php_interface/init.php:632
#223: CYakusHandlers::OnAfterEpilog()
	/home/bitrix/www/bitrix/modules/main/classes/general/module.php:465
#224: ExecuteModuleEventEx(array)
	/home/bitrix/www/bitrix/modules/main/classes/general/main.php:3487
#225: CAllMain::RunFinalActionsInternal()
	/home/bitrix/www/bitrix/modules/main/lib/application.php:187
#226: Bitrix\Main\Application->terminate(integer)
	/home/bitrix/www/bitrix/modules/main/lib/application.php:174
#227: Bitrix\Main\Application->end()
	/home/bitrix/www/bitrix/modules/main/tools.php:3885
#228: LocalRedirect(string, string)
	/home/bitrix/www/bitrix/php_interface/init.php:632
#229: CYakusHandlers::OnAfterEpilog()
	/home/bitrix/www/bitrix/modules/main/classes/general/module.php:465
#230: ExecuteModuleEventEx(array)
	/home/bitrix/www/bitrix/modules/main/classes/general/main.php:3487
#231: CAllMain::RunFinalActionsInternal()
	/home/bitrix/www/bitrix/modules/main/lib/application.php:187
#232: Bitrix\Main\Application->terminate(integer)
	/home/bitrix/www/bitrix/modules/main/lib/application.php:174
#233: Bitrix\Main\Application->end()
	/home/bitrix/www/bitrix/modules/main/tools.php:3885
#234: LocalRedirect(string, string)
	/home/bitrix/www/bitrix/php_interface/init.php:632
#235: CYakusHandlers::OnAfterEpilog()
	/home/bitrix/www/bitrix/modules/main/classes/general/module.php:465
#236: ExecuteModuleEventEx(array)
	/home/bitrix/www/bitrix/modules/main/classes/general/main.php:3487
#237: CAllMain::RunFinalActionsInternal()
	/home/bitrix/www/bitrix/modules/main/lib/application.php:187
#238: Bitrix\Main\Application->terminate(integer)
	/home/bitrix/www/bitrix/modules/main/lib/application.php:174
#239: Bitrix\Main\Application->end()
	/home/bitrix/www/bitrix/modules/main/tools.php:3885
#240: LocalRedirect(string, string)
	/home/bitrix/www/bitrix/php_interface/init.php:632
#241: CYakusHandlers::OnAfterEpilog()
	/home/bitrix/www/bitrix/modules/main/classes/general/module. php:465
#242: ExecuteModuleEventEx(array)
	/home/bitrix/www/bitrix/modules/main/classes/general/main.php:3487
#243: CAllMain::RunFinalActionsInternal()
	/home/bitrix/www/bitrix/modules/main/classes/general/main.php:3465
#244: CAllMain::FinalActions(string)
	/home/bitrix/www/bitrix/modules/main/include/epilog_after.php:54
#245: require(string)
	/home/bitrix/www/bitrix/modules/main/include/epilog.php:3
#246: require_once(string)
	/home/bitrix/www/bitrix/footer.php:4
#247: require(string)
	/home/bitrix/www/404.php:53
#248: require(string)
	/home/bitrix/www/bitrix/modules/iblock/lib/component/tools.php:66
#249: Bitrix\Iblock\Component\Tools::process404(string, boolean, boolean, boolean, string)
	/home/bitrix/www/bitrix/components/bitrix/news/component.php:145
#250: include(string)
	/home/bitrix/www/bitrix/modules/main/classes/general/component.php:605
#251: CBitrixComponent->__includeComponent()
	/home/bitrix/www/bitrix/modules/main/classes/general/component.php:680
#252: CBitrixComponent->includeComponent(string, array, boolean, boolean)
	/home/bitrix/www/bitrix/modules/main/classes/general/main.php:1039
#253: CAllMain->IncludeComponent(string, string, array, boolean)
	/home/bitrix/www/articles/index.php:132
#254: include_once(string)
	/home/bitrix/www/bitrix/modules/main/include/urlrewrite.php:159
#255: include_once(string)
	/home/bitrix/www/bitrix/urlrewrite.php:2

аналитика, советы, помощь с выбором материалов.

[Error] 
Maximum function nesting level of '256' reached, aborting! (0)
/home/bitrix/www/bitrix/modules/main/lib/config/option.php:430
#0: Bitrix\Main\Config\Option::getDefaultSite()
	/home/bitrix/www/bitrix/modules/main/lib/config/option.php:43
#1: Bitrix\Main\Config\Option::get(string, string, string, boolean)
	/home/bitrix/www/bitrix/modules/main/classes/general/option.php:30
#2: CAllOption::GetOptionString(string, string, string)
	/home/bitrix/www/bitrix/modules/main/classes/general/main.php:2699
#3: CAllMain->get_cookie(string)
	/home/bitrix/www/bitrix/modules/main/lib/composite/engine. php:1321
#4: Bitrix\Main\Composite\Engine::onEpilog()
	/home/bitrix/www/bitrix/modules/main/classes/general/module.php:480
#5: ExecuteModuleEventEx(array)
	/home/bitrix/www/bitrix/modules/main/tools.php:3880
#6: LocalRedirect(string, string)
	/home/bitrix/www/bitrix/php_interface/init.php:632
#7: CYakusHandlers::OnAfterEpilog()
	/home/bitrix/www/bitrix/modules/main/classes/general/module.php:465
#8: ExecuteModuleEventEx(array)
	/home/bitrix/www/bitrix/modules/main/classes/general/main.php:3487
#9: CAllMain::RunFinalActionsInternal()
	/home/bitrix/www/bitrix/modules/main/lib/application.php:187
#10: Bitrix\Main\Application->terminate(integer)
	/home/bitrix/www/bitrix/modules/main/lib/application.php:174
#11: Bitrix\Main\Application->end()
	/home/bitrix/www/bitrix/modules/main/tools.php:3885
#12: LocalRedirect(string, string)
	/home/bitrix/www/bitrix/php_interface/init.php:632
#13: CYakusHandlers::OnAfterEpilog()
	/home/bitrix/www/bitrix/modules/main/classes/general/module.php:465
#14: ExecuteModuleEventEx(array)
	/home/bitrix/www/bitrix/modules/main/classes/general/main.php:3487
#15: CAllMain::RunFinalActionsInternal()
	/home/bitrix/www/bitrix/modules/main/lib/application.php:187
#16: Bitrix\Main\Application->terminate(integer)
	/home/bitrix/www/bitrix/modules/main/lib/application.php:174
#17: Bitrix\Main\Application->end()
	/home/bitrix/www/bitrix/modules/main/tools.php:3885
#18: LocalRedirect(string, string)
	/home/bitrix/www/bitrix/php_interface/init.php:632
#19: CYakusHandlers::OnAfterEpilog()
	/home/bitrix/www/bitrix/modules/main/classes/general/module.php:465
#20: ExecuteModuleEventEx(array)
	/home/bitrix/www/bitrix/modules/main/classes/general/main.php:3487
#21: CAllMain::RunFinalActionsInternal()
	/home/bitrix/www/bitrix/modules/main/lib/application.php:187
#22: Bitrix\Main\Application->terminate(integer)
	/home/bitrix/www/bitrix/modules/main/lib/application.php:174
#23: Bitrix\Main\Application->end()
	/home/bitrix/www/bitrix/modules/main/tools. php:3885
#24: LocalRedirect(string, string)
	/home/bitrix/www/bitrix/php_interface/init.php:632
#25: CYakusHandlers::OnAfterEpilog()
	/home/bitrix/www/bitrix/modules/main/classes/general/module.php:465
#26: ExecuteModuleEventEx(array)
	/home/bitrix/www/bitrix/modules/main/classes/general/main.php:3487
#27: CAllMain::RunFinalActionsInternal()
	/home/bitrix/www/bitrix/modules/main/lib/application.php:187
#28: Bitrix\Main\Application->terminate(integer)
	/home/bitrix/www/bitrix/modules/main/lib/application.php:174
#29: Bitrix\Main\Application->end()
	/home/bitrix/www/bitrix/modules/main/tools.php:3885
#30: LocalRedirect(string, string)
	/home/bitrix/www/bitrix/php_interface/init.php:632
#31: CYakusHandlers::OnAfterEpilog()
	/home/bitrix/www/bitrix/modules/main/classes/general/module.php:465
#32: ExecuteModuleEventEx(array)
	/home/bitrix/www/bitrix/modules/main/classes/general/main.php:3487
#33: CAllMain::RunFinalActionsInternal()
	/home/bitrix/www/bitrix/modules/main/lib/application.php:187
#34: Bitrix\Main\Application->terminate(integer)
	/home/bitrix/www/bitrix/modules/main/lib/application.php:174
#35: Bitrix\Main\Application->end()
	/home/bitrix/www/bitrix/modules/main/tools.php:3885
#36: LocalRedirect(string, string)
	/home/bitrix/www/bitrix/php_interface/init.php:632
#37: CYakusHandlers::OnAfterEpilog()
	/home/bitrix/www/bitrix/modules/main/classes/general/module.php:465
#38: ExecuteModuleEventEx(array)
	/home/bitrix/www/bitrix/modules/main/classes/general/main.php:3487
#39: CAllMain::RunFinalActionsInternal()
	/home/bitrix/www/bitrix/modules/main/lib/application.php:187
#40: Bitrix\Main\Application->terminate(integer)
	/home/bitrix/www/bitrix/modules/main/lib/application.php:174
#41: Bitrix\Main\Application->end()
	/home/bitrix/www/bitrix/modules/main/tools.php:3885
#42: LocalRedirect(string, string)
	/home/bitrix/www/bitrix/php_interface/init.php:632
#43: CYakusHandlers::OnAfterEpilog()
	/home/bitrix/www/bitrix/modules/main/classes/general/module.php:465
#44: ExecuteModuleEventEx(array)
	/home/bitrix/www/bitrix/modules/main/classes/general/main.php:3487
#45: CAllMain::RunFinalActionsInternal()
	/home/bitrix/www/bitrix/modules/main/lib/application.php:187
#46: Bitrix\Main\Application->terminate(integer)
	/home/bitrix/www/bitrix/modules/main/lib/application.php:174
#47: Bitrix\Main\Application->end()
	/home/bitrix/www/bitrix/modules/main/tools.php:3885
#48: LocalRedirect(string, string)
	/home/bitrix/www/bitrix/php_interface/init.php:632
#49: CYakusHandlers::OnAfterEpilog()
	/home/bitrix/www/bitrix/modules/main/classes/general/module.php:465
#50: ExecuteModuleEventEx(array)
	/home/bitrix/www/bitrix/modules/main/classes/general/main.php:3487
#51: CAllMain::RunFinalActionsInternal()
	/home/bitrix/www/bitrix/modules/main/lib/application.php:187
#52: Bitrix\Main\Application->terminate(integer)
	/home/bitrix/www/bitrix/modules/main/lib/application.php:174
#53: Bitrix\Main\Application->end()
	/home/bitrix/www/bitrix/modules/main/tools.php:3885
#54: LocalRedirect(string, string)
	/home/bitrix/www/bitrix/php_interface/init.php:632
#55: CYakusHandlers::OnAfterEpilog()
	/home/bitrix/www/bitrix/modules/main/classes/general/module.php:465
#56: ExecuteModuleEventEx(array)
	/home/bitrix/www/bitrix/modules/main/classes/general/main.php:3487
#57: CAllMain::RunFinalActionsInternal()
	/home/bitrix/www/bitrix/modules/main/lib/application.php:187
#58: Bitrix\Main\Application->terminate(integer)
	/home/bitrix/www/bitrix/modules/main/lib/application.php:174
#59: Bitrix\Main\Application->end()
	/home/bitrix/www/bitrix/modules/main/tools.php:3885
#60: LocalRedirect(string, string)
	/home/bitrix/www/bitrix/php_interface/init.php:632
#61: CYakusHandlers::OnAfterEpilog()
	/home/bitrix/www/bitrix/modules/main/classes/general/module.php:465
#62: ExecuteModuleEventEx(array)
	/home/bitrix/www/bitrix/modules/main/classes/general/main.php:3487
#63: CAllMain::RunFinalActionsInternal()
	/home/bitrix/www/bitrix/modules/main/lib/application.php:187
#64: Bitrix\Main\Application->terminate(integer)
	/home/bitrix/www/bitrix/modules/main/lib/application.php:174
#65: Bitrix\Main\Application->end()
	/home/bitrix/www/bitrix/modules/main/tools.php:3885
#66: LocalRedirect(string, string)
	/home/bitrix/www/bitrix/php_interface/init.php:632
#67: CYakusHandlers::OnAfterEpilog()
	/home/bitrix/www/bitrix/modules/main/classes/general/module.php:465
#68: ExecuteModuleEventEx(array)
	/home/bitrix/www/bitrix/modules/main/classes/general/main.php:3487
#69: CAllMain::RunFinalActionsInternal()
	/home/bitrix/www/bitrix/modules/main/lib/application.php:187
#70: Bitrix\Main\Application->terminate(integer)
	/home/bitrix/www/bitrix/modules/main/lib/application.php:174
#71: Bitrix\Main\Application->end()
	/home/bitrix/www/bitrix/modules/main/tools.php:3885
#72: LocalRedirect(string, string)
	/home/bitrix/www/bitrix/php_interface/init.php:632
#73: CYakusHandlers::OnAfterEpilog()
	/home/bitrix/www/bitrix/modules/main/classes/general/module.php:465
#74: ExecuteModuleEventEx(array)
	/home/bitrix/www/bitrix/modules/main/classes/general/main.php:3487
#75: CAllMain::RunFinalActionsInternal()
	/home/bitrix/www/bitrix/modules/main/lib/application.php:187
#76: Bitrix\Main\Application->terminate(integer)
	/home/bitrix/www/bitrix/modules/main/lib/application.php:174
#77: Bitrix\Main\Application->end()
	/home/bitrix/www/bitrix/modules/main/tools.php:3885
#78: LocalRedirect(string, string)
	/home/bitrix/www/bitrix/php_interface/init.php:632
#79: CYakusHandlers::OnAfterEpilog()
	/home/bitrix/www/bitrix/modules/main/classes/general/module.php:465
#80: ExecuteModuleEventEx(array)
	/home/bitrix/www/bitrix/modules/main/classes/general/main.php:3487
#81: CAllMain::RunFinalActionsInternal()
	/home/bitrix/www/bitrix/modules/main/lib/application.php:187
#82: Bitrix\Main\Application->terminate(integer)
	/home/bitrix/www/bitrix/modules/main/lib/application.php:174
#83: Bitrix\Main\Application->end()
	/home/bitrix/www/bitrix/modules/main/tools.php:3885
#84: LocalRedirect(string, string)
	/home/bitrix/www/bitrix/php_interface/init.php:632
#85: CYakusHandlers::OnAfterEpilog()
	/home/bitrix/www/bitrix/modules/main/classes/general/module.php:465
#86: ExecuteModuleEventEx(array)
	/home/bitrix/www/bitrix/modules/main/classes/general/main.php:3487
#87: CAllMain::RunFinalActionsInternal()
	/home/bitrix/www/bitrix/modules/main/lib/application.php:187
#88: Bitrix\Main\Application->terminate(integer)
	/home/bitrix/www/bitrix/modules/main/lib/application.php:174
#89: Bitrix\Main\Application->end()
	/home/bitrix/www/bitrix/modules/main/tools.php:3885
#90: LocalRedirect(string, string)
	/home/bitrix/www/bitrix/php_interface/init.php:632
#91: CYakusHandlers::OnAfterEpilog()
	/home/bitrix/www/bitrix/modules/main/classes/general/module.php:465
#92: ExecuteModuleEventEx(array)
	/home/bitrix/www/bitrix/modules/main/classes/general/main.php:3487
#93: CAllMain::RunFinalActionsInternal()
	/home/bitrix/www/bitrix/modules/main/lib/application.php:187
#94: Bitrix\Main\Application->terminate(integer)
	/home/bitrix/www/bitrix/modules/main/lib/application.php:174
#95: Bitrix\Main\Application->end()
	/home/bitrix/www/bitrix/modules/main/tools.php:3885
#96: LocalRedirect(string, string)
	/home/bitrix/www/bitrix/php_interface/init.php:632
#97: CYakusHandlers::OnAfterEpilog()
	/home/bitrix/www/bitrix/modules/main/classes/general/module.php:465
#98: ExecuteModuleEventEx(array)
	/home/bitrix/www/bitrix/modules/main/classes/general/main.php:3487
#99: CAllMain::RunFinalActionsInternal()
	/home/bitrix/www/bitrix/modules/main/lib/application.php:187
#100: Bitrix\Main\Application->terminate(integer)
	/home/bitrix/www/bitrix/modules/main/lib/application.php:174
#101: Bitrix\Main\Application->end()
	/home/bitrix/www/bitrix/modules/main/tools.php:3885
#102: LocalRedirect(string, string)
	/home/bitrix/www/bitrix/php_interface/init.php:632
#103: CYakusHandlers::OnAfterEpilog()
	/home/bitrix/www/bitrix/modules/main/classes/general/module.php:465
#104: ExecuteModuleEventEx(array)
	/home/bitrix/www/bitrix/modules/main/classes/general/main.php:3487
#105: CAllMain::RunFinalActionsInternal()
	/home/bitrix/www/bitrix/modules/main/lib/application.php:187
#106: Bitrix\Main\Application->terminate(integer)
	/home/bitrix/www/bitrix/modules/main/lib/application.php:174
#107: Bitrix\Main\Application->end()
	/home/bitrix/www/bitrix/modules/main/tools.php:3885
#108: LocalRedirect(string, string)
	/home/bitrix/www/bitrix/php_interface/init.php:632
#109: CYakusHandlers::OnAfterEpilog()
	/home/bitrix/www/bitrix/modules/main/classes/general/module.php:465
#110: ExecuteModuleEventEx(array)
	/home/bitrix/www/bitrix/modules/main/classes/general/main.php:3487
#111: CAllMain::RunFinalActionsInternal()
	/home/bitrix/www/bitrix/modules/main/lib/application.php:187
#112: Bitrix\Main\Application->terminate(integer)
	/home/bitrix/www/bitrix/modules/main/lib/application.php:174
#113: Bitrix\Main\Application->end()
	/home/bitrix/www/bitrix/modules/main/tools.php:3885
#114: LocalRedirect(string, string)
	/home/bitrix/www/bitrix/php_interface/init.php:632
#115: CYakusHandlers::OnAfterEpilog()
	/home/bitrix/www/bitrix/modules/main/classes/general/module.php:465
#116: ExecuteModuleEventEx(array)
	/home/bitrix/www/bitrix/modules/main/classes/general/main.php:3487
#117: CAllMain::RunFinalActionsInternal()
	/home/bitrix/www/bitrix/modules/main/lib/application.php:187
#118: Bitrix\Main\Application->terminate(integer)
	/home/bitrix/www/bitrix/modules/main/lib/application.php:174
#119: Bitrix\Main\Application->end()
	/home/bitrix/www/bitrix/modules/main/tools.php:3885
#120: LocalRedirect(string, string)
	/home/bitrix/www/bitrix/php_interface/init.php:632
#121: CYakusHandlers::OnAfterEpilog()
	/home/bitrix/www/bitrix/modules/main/classes/general/module.php:465
#122: ExecuteModuleEventEx(array)
	/home/bitrix/www/bitrix/modules/main/classes/general/main.php:3487
#123: CAllMain::RunFinalActionsInternal()
	/home/bitrix/www/bitrix/modules/main/lib/application.php:187
#124: Bitrix\Main\Application->terminate(integer)
	/home/bitrix/www/bitrix/modules/main/lib/application.php:174
#125: Bitrix\Main\Application->end()
	/home/bitrix/www/bitrix/modules/main/tools.php:3885
#126: LocalRedirect(string, string)
	/home/bitrix/www/bitrix/php_interface/init.php:632
#127: CYakusHandlers::OnAfterEpilog()
	/home/bitrix/www/bitrix/modules/main/classes/general/module.php:465
#128: ExecuteModuleEventEx(array)
	/home/bitrix/www/bitrix/modules/main/classes/general/main.php:3487
#129: CAllMain::RunFinalActionsInternal()
	/home/bitrix/www/bitrix/modules/main/lib/application.php:187
#130: Bitrix\Main\Application->terminate(integer)
	/home/bitrix/www/bitrix/modules/main/lib/application.php:174
#131: Bitrix\Main\Application->end()
	/home/bitrix/www/bitrix/modules/main/tools.php:3885
#132: LocalRedirect(string, string)
	/home/bitrix/www/bitrix/php_interface/init.php:632
#133: CYakusHandlers::OnAfterEpilog()
	/home/bitrix/www/bitrix/modules/main/classes/general/module.php:465
#134: ExecuteModuleEventEx(array)
	/home/bitrix/www/bitrix/modules/main/classes/general/main.php:3487
#135: CAllMain::RunFinalActionsInternal()
	/home/bitrix/www/bitrix/modules/main/lib/application.php:187
#136: Bitrix\Main\Application->terminate(integer)
	/home/bitrix/www/bitrix/modules/main/lib/application.php:174
#137: Bitrix\Main\Application->end()
	/home/bitrix/www/bitrix/modules/main/tools.php:3885
#138: LocalRedirect(string, string)
	/home/bitrix/www/bitrix/php_interface/init.php:632
#139: CYakusHandlers::OnAfterEpilog()
	/home/bitrix/www/bitrix/modules/main/classes/general/module.php:465
#140: ExecuteModuleEventEx(array)
	/home/bitrix/www/bitrix/modules/main/classes/general/main.php:3487
#141: CAllMain::RunFinalActionsInternal()
	/home/bitrix/www/bitrix/modules/main/lib/application.php:187
#142: Bitrix\Main\Application->terminate(integer)
	/home/bitrix/www/bitrix/modules/main/lib/application.php:174
#143: Bitrix\Main\Application->end()
	/home/bitrix/www/bitrix/modules/main/tools.php:3885
#144: LocalRedirect(string, string)
	/home/bitrix/www/bitrix/php_interface/init.php:632
#145: CYakusHandlers::OnAfterEpilog()
	/home/bitrix/www/bitrix/modules/main/classes/general/module.php:465
#146: ExecuteModuleEventEx(array)
	/home/bitrix/www/bitrix/modules/main/classes/general/main.php:3487
#147: CAllMain::RunFinalActionsInternal()
	/home/bitrix/www/bitrix/modules/main/lib/application.php:187
#148: Bitrix\Main\Application->terminate(integer)
	/home/bitrix/www/bitrix/modules/main/lib/application.php:174
#149: Bitrix\Main\Application->end()
	/home/bitrix/www/bitrix/modules/main/tools.php:3885
#150: LocalRedirect(string, string)
	/home/bitrix/www/bitrix/php_interface/init.php:632
#151: CYakusHandlers::OnAfterEpilog()
	/home/bitrix/www/bitrix/modules/main/classes/general/module.php:465
#152: ExecuteModuleEventEx(array)
	/home/bitrix/www/bitrix/modules/main/classes/general/main.php:3487
#153: CAllMain::RunFinalActionsInternal()
	/home/bitrix/www/bitrix/modules/main/lib/application.php:187
#154: Bitrix\Main\Application->terminate(integer)
	/home/bitrix/www/bitrix/modules/main/lib/application.php:174
#155: Bitrix\Main\Application->end()
	/home/bitrix/www/bitrix/modules/main/tools.php:3885
#156: LocalRedirect(string, string)
	/home/bitrix/www/bitrix/php_interface/init.php:632
#157: CYakusHandlers::OnAfterEpilog()
	/home/bitrix/www/bitrix/modules/main/classes/general/module.php:465
#158: ExecuteModuleEventEx(array)
	/home/bitrix/www/bitrix/modules/main/classes/general/main.php:3487
#159: CAllMain::RunFinalActionsInternal()
	/home/bitrix/www/bitrix/modules/main/lib/application.php:187
#160: Bitrix\Main\Application->terminate(integer)
	/home/bitrix/www/bitrix/modules/main/lib/application.php:174
#161: Bitrix\Main\Application->end()
	/home/bitrix/www/bitrix/modules/main/tools.php:3885
#162: LocalRedirect(string, string)
	/home/bitrix/www/bitrix/php_interface/init.php:632
#163: CYakusHandlers::OnAfterEpilog()
	/home/bitrix/www/bitrix/modules/main/classes/general/module.php:465
#164: ExecuteModuleEventEx(array)
	/home/bitrix/www/bitrix/modules/main/classes/general/main.php:3487
#165: CAllMain::RunFinalActionsInternal()
	/home/bitrix/www/bitrix/modules/main/lib/application.php:187
#166: Bitrix\Main\Application->terminate(integer)
	/home/bitrix/www/bitrix/modules/main/lib/application.php:174
#167: Bitrix\Main\Application->end()
	/home/bitrix/www/bitrix/modules/main/tools.php:3885
#168: LocalRedirect(string, string)
	/home/bitrix/www/bitrix/php_interface/init.php:632
#169: CYakusHandlers::OnAfterEpilog()
	/home/bitrix/www/bitrix/modules/main/classes/general/module.php:465
#170: ExecuteModuleEventEx(array)
	/home/bitrix/www/bitrix/modules/main/classes/general/main.php:3487
#171: CAllMain::RunFinalActionsInternal()
	/home/bitrix/www/bitrix/modules/main/lib/application.php:187
#172: Bitrix\Main\Application->terminate(integer)
	/home/bitrix/www/bitrix/modules/main/lib/application.php:174
#173: Bitrix\Main\Application->end()
	/home/bitrix/www/bitrix/modules/main/tools.php:3885
#174: LocalRedirect(string, string)
	/home/bitrix/www/bitrix/php_interface/init.php:632
#175: CYakusHandlers::OnAfterEpilog()
	/home/bitrix/www/bitrix/modules/main/classes/general/module.php:465
#176: ExecuteModuleEventEx(array)
	/home/bitrix/www/bitrix/modules/main/classes/general/main.php:3487
#177: CAllMain::RunFinalActionsInternal()
	/home/bitrix/www/bitrix/modules/main/lib/application.php:187
#178: Bitrix\Main\Application->terminate(integer)
	/home/bitrix/www/bitrix/modules/main/lib/application.php:174
#179: Bitrix\Main\Application->end()
	/home/bitrix/www/bitrix/modules/main/tools.php:3885
#180: LocalRedirect(string, string)
	/home/bitrix/www/bitrix/php_interface/init.php:632
#181: CYakusHandlers::OnAfterEpilog()
	/home/bitrix/www/bitrix/modules/main/classes/general/module.php:465
#182: ExecuteModuleEventEx(array)
	/home/bitrix/www/bitrix/modules/main/classes/general/main.php:3487
#183: CAllMain::RunFinalActionsInternal()
	/home/bitrix/www/bitrix/modules/main/lib/application.php:187
#184: Bitrix\Main\Application->terminate(integer)
	/home/bitrix/www/bitrix/modules/main/lib/application.php:174
#185: Bitrix\Main\Application->end()
	/home/bitrix/www/bitrix/modules/main/tools.php:3885
#186: LocalRedirect(string, string)
	/home/bitrix/www/bitrix/php_interface/init.php:632
#187: CYakusHandlers::OnAfterEpilog()
	/home/bitrix/www/bitrix/modules/main/classes/general/module.php:465
#188: ExecuteModuleEventEx(array)
	/home/bitrix/www/bitrix/modules/main/classes/general/main.php:3487
#189: CAllMain::RunFinalActionsInternal()
	/home/bitrix/www/bitrix/modules/main/lib/application.php:187
#190: Bitrix\Main\Application->terminate(integer)
	/home/bitrix/www/bitrix/modules/main/lib/application.php:174
#191: Bitrix\Main\Application->end()
	/home/bitrix/www/bitrix/modules/main/tools.php:3885
#192: LocalRedirect(string, string)
	/home/bitrix/www/bitrix/php_interface/init.php:632
#193: CYakusHandlers::OnAfterEpilog()
	/home/bitrix/www/bitrix/modules/main/classes/general/module.php:465
#194: ExecuteModuleEventEx(array)
	/home/bitrix/www/bitrix/modules/main/classes/general/main.php:3487
#195: CAllMain::RunFinalActionsInternal()
	/home/bitrix/www/bitrix/modules/main/lib/application.php:187
#196: Bitrix\Main\Application->terminate(integer)
	/home/bitrix/www/bitrix/modules/main/lib/application.php:174
#197: Bitrix\Main\Application->end()
	/home/bitrix/www/bitrix/modules/main/tools.php:3885
#198: LocalRedirect(string, string)
	/home/bitrix/www/bitrix/php_interface/init.php:632
#199: CYakusHandlers::OnAfterEpilog()
	/home/bitrix/www/bitrix/modules/main/classes/general/module.php:465
#200: ExecuteModuleEventEx(array)
	/home/bitrix/www/bitrix/modules/main/classes/general/main.php:3487
#201: CAllMain::RunFinalActionsInternal()
	/home/bitrix/www/bitrix/modules/main/lib/application.php:187
#202: Bitrix\Main\Application->terminate(integer)
	/home/bitrix/www/bitrix/modules/main/lib/application.php:174
#203: Bitrix\Main\Application->end()
	/home/bitrix/www/bitrix/modules/main/tools.php:3885
#204: LocalRedirect(string, string)
	/home/bitrix/www/bitrix/php_interface/init.php:632
#205: CYakusHandlers::OnAfterEpilog()
	/home/bitrix/www/bitrix/modules/main/classes/general/module.php:465
#206: ExecuteModuleEventEx(array)
	/home/bitrix/www/bitrix/modules/main/classes/general/main.php:3487
#207: CAllMain::RunFinalActionsInternal()
	/home/bitrix/www/bitrix/modules/main/lib/application.php:187
#208: Bitrix\Main\Application->terminate(integer)
	/home/bitrix/www/bitrix/modules/main/lib/application.php:174
#209: Bitrix\Main\Application->end()
	/home/bitrix/www/bitrix/modules/main/tools.php:3885
#210: LocalRedirect(string, string)
	/home/bitrix/www/bitrix/php_interface/init.php:632
#211: CYakusHandlers::OnAfterEpilog()
	/home/bitrix/www/bitrix/modules/main/classes/general/module.php:465
#212: ExecuteModuleEventEx(array)
	/home/bitrix/www/bitrix/modules/main/classes/general/main.php:3487
#213: CAllMain::RunFinalActionsInternal()
	/home/bitrix/www/bitrix/modules/main/lib/application.php:187
#214: Bitrix\Main\Application->terminate(integer)
	/home/bitrix/www/bitrix/modules/main/lib/application.php:174
#215: Bitrix\Main\Application->end()
	/home/bitrix/www/bitrix/modules/main/tools.php:3885
#216: LocalRedirect(string, string)
	/home/bitrix/www/bitrix/php_interface/init.php:632
#217: CYakusHandlers::OnAfterEpilog()
	/home/bitrix/www/bitrix/modules/main/classes/general/module.php:465
#218: ExecuteModuleEventEx(array)
	/home/bitrix/www/bitrix/modules/main/classes/general/main.php:3487
#219: CAllMain::RunFinalActionsInternal()
	/home/bitrix/www/bitrix/modules/main/lib/application.php:187
#220: Bitrix\Main\Application->terminate(integer)
	/home/bitrix/www/bitrix/modules/main/lib/application.php:174
#221: Bitrix\Main\Application->end()
	/home/bitrix/www/bitrix/modules/main/tools.php:3885
#222: LocalRedirect(string, string)
	/home/bitrix/www/bitrix/php_interface/init.php:632
#223: CYakusHandlers::OnAfterEpilog()
	/home/bitrix/www/bitrix/modules/main/classes/general/module.php:465
#224: ExecuteModuleEventEx(array)
	/home/bitrix/www/bitrix/modules/main/classes/general/main.php:3487
#225: CAllMain::RunFinalActionsInternal()
	/home/bitrix/www/bitrix/modules/main/lib/application.php:187
#226: Bitrix\Main\Application->terminate(integer)
	/home/bitrix/www/bitrix/modules/main/lib/application.php:174
#227: Bitrix\Main\Application->end()
	/home/bitrix/www/bitrix/modules/main/tools.php:3885
#228: LocalRedirect(string, string)
	/home/bitrix/www/bitrix/php_interface/init.php:632
#229: CYakusHandlers::OnAfterEpilog()
	/home/bitrix/www/bitrix/modules/main/classes/general/module.php:465
#230: ExecuteModuleEventEx(array)
	/home/bitrix/www/bitrix/modules/main/classes/general/main.php:3487
#231: CAllMain::RunFinalActionsInternal()
	/home/bitrix/www/bitrix/modules/main/lib/application.php:187
#232: Bitrix\Main\Application->terminate(integer)
	/home/bitrix/www/bitrix/modules/main/lib/application.php:174
#233: Bitrix\Main\Application->end()
	/home/bitrix/www/bitrix/modules/main/tools.php:3885
#234: LocalRedirect(string, string)
	/home/bitrix/www/bitrix/php_interface/init.php:632
#235: CYakusHandlers::OnAfterEpilog()
	/home/bitrix/www/bitrix/modules/main/classes/general/module.php:465
#236: ExecuteModuleEventEx(array)
	/home/bitrix/www/bitrix/modules/main/classes/general/main.php:3487
#237: CAllMain::RunFinalActionsInternal()
	/home/bitrix/www/bitrix/modules/main/lib/application.php:187
#238: Bitrix\Main\Application->terminate(integer)
	/home/bitrix/www/bitrix/modules/main/lib/application.php:174
#239: Bitrix\Main\Application->end()
	/home/bitrix/www/bitrix/modules/main/tools.php:3885
#240: LocalRedirect(string, string)
	/home/bitrix/www/bitrix/php_interface/init.php:632
#241: CYakusHandlers::OnAfterEpilog()
	/home/bitrix/www/bitrix/modules/main/classes/general/module.php:465
#242: ExecuteModuleEventEx(array)
	/home/bitrix/www/bitrix/modules/main/classes/general/main.php:3487
#243: CAllMain::RunFinalActionsInternal()
	/home/bitrix/www/bitrix/modules/main/classes/general/main.php:3465
#244: CAllMain::FinalActions(string)
	/home/bitrix/www/bitrix/modules/main/include/epilog_after.php:54
#245: require(string)
	/home/bitrix/www/bitrix/modules/main/include/epilog.php:3
#246: require_once(string)
	/home/bitrix/www/bitrix/footer.php:4
#247: require(string)
	/home/bitrix/www/404.php:53
#248: require(string)
	/home/bitrix/www/bitrix/modules/iblock/lib/component/tools.php:66
#249: Bitrix\Iblock\Component\Tools::process404(string, boolean, boolean, boolean, string)
	/home/bitrix/www/bitrix/components/bitrix/news/component.php:145
#250: include(string)
	/home/bitrix/www/bitrix/modules/main/classes/general/component.php:605
#251: CBitrixComponent->__includeComponent()
	/home/bitrix/www/bitrix/modules/main/classes/general/component.php:680
#252: CBitrixComponent->includeComponent(string, array, boolean, boolean)
	/home/bitrix/www/bitrix/modules/main/classes/general/main.php:1039
#253: CAllMain->IncludeComponent(string, string, array, boolean)
	/home/bitrix/www/articles/index.php:132
#254: include_once(string)
	/home/bitrix/www/bitrix/modules/main/include/urlrewrite.php:159
#255: include_once(string)
	/home/bitrix/www/bitrix/urlrewrite.php:2

ЦПС – пропорции цемента и песка, норма расхода, как развести сухую смесь водой

Существуют сухие смеси заводского производства и изготовленные самостоятельно на строительной площадке. Первые в рознице доступны в мешках по 50 и 25 кг и имеют строго определённый состав компонентов. Их приготовление требует только затворения смеси водой в объёме, который указан на упаковке. Если был выбран хороший производитель, то полученный в результате раствор будет отвечать всем характеристикам, которые заявлены в описании продукта на мешке.

Особенности замеса своими руками

Гораздо сложнее обстоит дело с самомесными растворами. Здесь используется цемент, купленный в ближайшем строительном магазине, и песок, качество которого также под вопросом. Заводы по производству строительных смесей получают ингредиенты для своей продукции у постоянных поставщиков. Там используется цемент точно известной марки, без примесей и в идеально сухом состоянии. Песок либо уже приходит в очищенном виде, либо подвергается нескольким этапам очистки на заводе.

Если вы выбрали надёжного производителя цемента и уверены в качестве его продукции, то в любом случае под вопросом остаётся песок. На марку готового раствора будет влиять не только зернистость песка, но также и его влажность. Измерение этих показателей на стройплощадке в принципе провести возможно, но делается данная процедура далеко не всегда. Таким образом, полученная в результате жидкая смесь не может быть с уверенностью отнесена к той или иной марке прочности.

Исходя из этого, на практике было установлено, что даже точное следование ГОСТовским нормам не даёт гарантию результата. Всегда нужно ориентироваться на объективные показатели, основным из которых является реальная консистенция раствора. Пропорции цемента и песка в составе ЦПС можно с определённой точностью установить, а количество требуемой воды выбирается индивидуально на месте изготовления раствора.

Составы смесей

Для кладки потребуется смесь, в составе которой на 1 часть цемента М400 содержится 4,5 частей чистого карьерного песка. Таким образом будет получен раствор с прочностью близкой к М100. Количество воды лежит в пределах от 0,45 до 0,6 частей от объёма цемента. Штукатурка потребует раствора с пропорциями от 1:3 до 1:5, в зависимости от марки цемента и вида работ. Финишный слой требует более прочной смеси, а в черновой можно класть немого меньше цемента.

Пропорции для стяжки чуть более строгие — здесь на 1 часть цемента М400 нельзя использовать больше 3 частей песка. В противном случае поверхность пола не будет иметь достаточной прочности и износостойкости. Чтобы узнать, как рассчитать расход воды на 1 кг сухой смеси, нужно держаться в пределах между 0,45 и 0,55 частей воды на 1 часть цемента. Точное количество устанавливается исходя из консистенции раствора. Вопрос, как разводить смесь решается наблюдением за её жёсткостью: раствор должен хорошо держаться на мастерке и не сползать с него.

Изготовление тротуарной плитки подразумевает использование крупнофракционного песка. Такой материал будет не обычной песчано-цементной смесью, а пескобетоном. Оптимальная марка в данном случае М300, пропорции для тротуарной плитки составят 1:2,5 с использованием цемента М500. Объём воды берётся из расчёта примерно 1/5 части от объёма смеси цемента с песком.

как правильно выбрать и использовать. «ВИМОС»

Цементно-песчаная смесь (или сокращенно ЦПС) представляет собой сухую смесь, состоящую из цемента, песка и других специальных добавок, которые повышают ее качество, например морозостойкость. Используется в ремонте и строительстве.

Расход смеси примерно 2 кг на 1 квадратный метр при толщине слоя 1 мм. Соответственно, на тот же квадратный метр толщиной слоя 10 мм — потребуется 20 кг. Например, если нужно покрыть помещение площадью 10 квадратных метров толщиной слоя 1 см, то для этого потребуется 200 кг смеси ЦПС (8 мешков по 25 кг).

Какую купить марку ЦПС

Выбирая марку ЦСП стоит исходить от степени эксплуатации помещения и нагрузки на поверхность. Конкретный пример: марка ЦПС смесь М300. Цифра 300 означает предел эксплуатационной нагрузки на один кубический метр. То есть, в данном случае не более 300 кг нагрузки на 1 кубометр помещения.

Инструкция по применению ЦПС

В зависимости от выбранной ЦПС показатели могут незначительно варьироваться — соотношение расхода, время затвердевания и жизнеспособности. Внимательно читайте упаковку.

Перед началом работы нужно подготовить поверхность — основу. Для этого её нужно очистить от пыли, влаги и грязи. Если поверхность сильно впитывает, то можно пройтись по ней грунтовкой.

Далее смесь ЦПС смешивается с чистой водой комнатной температуры до нужной концентрации. Расход смеси ЦПС в среднем 1 кг на 250 мл воды (1 стандартная кружка для чая). Полученный раствор нужно тщательно перемешать палкой, миксером или дрелью с насадкой. Исключение составляют марки М400, для их готовки используют бетономешалки. В процессе перемешивания, нужно постепенно подсыпать смесь ЦПС и подливать воду в зависимости от требуемой густоты массы. В итоге должна получиться густая масса без комочков.

После перемешивания нужно дать массе отстояться 5–10 минут, а затем ещё раз помешать. Полученная в итоге масса жизнеспособна 1,5–2 часа, поэтому не рекомендуется мешать сразу много мешков, если ремонт производится в одиночку. Рекомендуемая толщина слоя не должна быть меньше 5 мм, но не больше 5 см. После нанесения слоя нужно дать смеси просохнуть в течение нескольких часов. Время твердения отличается в зависимости от марки, обычно это время от 24 часов до 72 часов).

Допустимая температура помещения на момент высыхания, где использовалась смесь, должна быть от +6 до + 30°С. После выполнения работ необходимо тщательно вымыть инструменты. Также не рекомендуется выливать остатки раствора в канализацию.

Использован материал компании «ВИМОС»: vimos.ru

Цементно-песчаные смеси

Цементно-песчаные смеси (ЦПС) выполняются обычно в отношении 1:3. Такую смесь можно приготовить самим, а можно приобрести уже готовую. Раствор из нее используют при бетонировании различных строительных конструкций, чаще всего полов, для возведения кирпичных построек, кладки, обработки швов, заполнения трещин и выбоин, наружного оформления зданий и пр. ЦПС имеют ряд достоинств: практичность, влагостойкость и атмосферостойкость, монолитность, отсутствие швов и пустот, длительный срок эксплуатации.

Качественное покрытие идеально выравнивает поверхность, что позволяет претворить в жизнь самые смелые дизайнерские решения и не вызывает проблем с навеской мебели. Смеси используют и при отделке влажных помещений, ведь при высыхании штукатурка принимает прежний вид, сохраняя все свои качества.

Марка цементно-песчаной смесиМ-100М-150М-200М-300
Вяжущий компонентпортландцемент
Цвет сухой смесисерый
Влажность сухой смеси (%)0,1
Насыпная плотность (кг/м³)1550153015101355
Расход воды для затворения на 1 кг смеси (л)0,160,1660,1950,202
Марка по подвижности бетонной смеси (Пк)5-95 — 95-95-9
Время пригодности бетонной смеси к использованию (ч)не более 1не более 1не более 1не более 1
Средняя плотность бетона (кг/м³)1720177017801820
Прочность на сжатие бетона в возрасте 28 суток (МПа)10,015,020,030,0
Толщина слоя бетона (мм)  до 100 
Температура применения (°С)  5 – 30 
Расход материала при толщине слоя 1 мм (кг/м²)  1,59 
Фракция заполнителя (мм)  2,5 
Вес мешка (кг)  30 

 

В современном индивидуальном строительстве широкое применение получили перлит вспученный и перлитовый песок для пескоструйных работ, которые применяются как теплоизоляторы как в больших коттеджах, так и маленьких дачах.

Растворы, содержащие перлит вспученный, стали популярны на селе, так как 3-сантиметровый слой такого раствора заменяет 15 см кирпичной кладки. Такая штукатурка без проблем наносится на любую поверхность и придает более солидный вид отделке, а стены из вспученного перлита становятся огнеупорными.

Незаслуженно мало в российском строительстве используется песок для пескоструйных работ из перлита, он засыпается между слоями стены для огнестойкости и тепло и звукоизоляции сооружения и экономии стройматериалов. Также его применяют в перекрытиях между этажами, песком для пескоструйных работ заполняют пространство в углах между деревянными балками. Благодаря тому, что перлитовый песок способствует свободному доступу воздуха, дерево «дышит».

Все вышеперечисленные материалы пригодны для любых помещений, они не конкурируют друг с другом, а только дополняют. Песок и перлит природные, поэтому безопасны для здоровья. Смело используйте современные экологичные материалы в строительстве своего дома.

Какой состав у пескоцеметной смеси М400?

Цементно-песчаные смеси (ЦПС) являются востребованным строительным материалом на любых строительных площадках. Основная причина популярности – готовность ЦПС к использованию.

В соответствии со своим названием в ЦПС состоят из цемента, просеянного очищенного песка и различных присадок – «засыпай в бетономешалку, затворяй водой и через несколько минут цементный раствор готов к применению». Не надо закупать по отдельности песок, цемент и пластификаторы и тратить энергию и время на их перемешивание.

Область применения ЦПС марки М400

Цементно-песчаные смеси являются базовым материалом для строительства фундаментов, кладки стен, строительства полов и стяжек, оштукатуривания поверхностей и заделки трещин и швов.

ЦПС марки М400 – это один из самых прочных, морозостойких и пластичных строительных материалов. Основные сферы применения: заливка оснований пола, возведение несущих конструкций и наружных площадок, производство ЖБИ. Основной недостаток ЦПС М400 – относительно высокая стоимость.

Цементно-песчаная смесь своими руками

Классические пропорции ЦПС – 1 часть портландцемента и 3 части очищенного кварцевого песка. По такому рецепту готовят смесь для штукатурных работ. ЦПС для кладки готовят из 1 части цемента и 4 частей песка.

Такой вариант связующего отлично подходит для кладки стен и конструкций из «дикого» камня и кирпича. Для заливки стяжки пола, как правило, используют пропорции цемент-песок 1:4, однако если поверхность пола будет испытывать повышенные нагрузки, непосредственно в раствор добавляют фиброволокно в количестве 0,8 кг на 1 м3 готового раствора.

Технические характеристики ЦПС М400

  • Основа: портландцемент М500;
  • Наполнитель: кварцевый песок с максимальной крупностью зерна 2,5 мм;
  • Внешний вид: сыпучая однородная масса серого цвета;
  • Средний расход воды на затворение: 0,16-0,18 литров на 1 килограмм ЦПС;
  • Гарантированное время пригодности готового раствора: 0,5 часа;
  • Марка прочности: М400;
  • Допустимая толщина одного слоя раствора: не более 50 мм;
  • Средний расход для кладки стен при толщине слоя до 15 мм: 26-30 кг на 1 м2;
  • Средний расход для выравнивания стен при толщине слоя 1 мм: 1,7-1,9 кг на 1 м2.

Технология приготовления

Процесс приготовления ЦПС М400 прост, но имеет свои нюансы. Основное требование – максимально тщательное перемешивание компонентов.

Важно! Перемешивание компонентов производится в сухом состоянии, лучше всего в бетономешалке!

Далее, в сухую смесь небольшими порциями добавляется вода, до тех пор, пока текучесть раствора не достигнет нужной консистенции. Примерное количество воды указано выше. После приготовления, смеси дают выстояться в течение 15-20 минут, и раствор готов к работе.

C / C ++ Инструмент статического анализа и качества кода

Панели мониторинга были улучшены в пользовательском интерфейсе CppDepend в Visual Studio в разделе сгенерированных отчетов. Теперь он содержит технические оценки долга, параметры качества, правила и данные о проблемах.
Для каждых данных визуальный индикатор показывает прогресс по сравнению с исходным уровнем.
Значения красного и зеленого цвета используются для точного определения прогресса или регресса.
При щелчке по любому значению создается запрос, который детализирует соответствующие данные, которые могут быть списком элементов кода, оценками долга, порогами качества, правилами или проблемами.

Диаграммы трендов отображаются на панели инструментов CppDepend. Некоторые диаграммы тенденций доступны по умолчанию для отображения:

  • Строк кода
  • Количество нарушенных правил Кодекса и количество нарушений правил Кодекса
  • Покрытие кода по тестам
  • Максимальные и средние значения для различных показателей качества кода
  • Стороннее использование

DSM CppDepend предлагает множество опций:

  • Он имеет множество возможностей для исследования зависимостей (родительский столбец / строка может быть открыт, ячейки могут быть расширены…)
  • Может работать с прямоугольными симметричными DSM и прямоугольными несимметричными DSM
  • Строки и столбцы можно связать, чтобы постоянно иметь квадратную симметричную матрицу
  • Поставляется с опцией Непрямое использование , где ячейка показывает прямое и косвенное использование
  • Строки могут содержать элементы стороннего кода

Контроль качества — это проверка факта качества кода, который должен быть обеспечен перед выпуском и, в конечном итоге, перед фиксацией в системе контроля версий.Строб качества можно рассматривать как критерий «ПРОШЕЛ / НЕ ПРОШЕЛ» для оценки качества программного обеспечения.

CppDepend предлагает дюжину контрольных точек качества по умолчанию, связанных с такими показателями, как сумма технического долга, покрытие кода или количество проблем с особой серьезностью.

Обратите внимание, что специальный значок красного / желтого / зеленого цвета показывает статус контрольных точек качества: не пройден / предупрежден / прошел.

CppDepend может анализировать исходный код и проекты C ++ через CppDepend.Console.exe. Каждый раз, когда он анализирует кодовую базу, CppDepend выдает отчет, который может информировать вас о статусе вашей разработки. Вы можете настроить разделы, отображаемые в отчете, и даже предоставить свой собственный XSL-лист для полной настройки.

Вы также можете создать свой собственный набор ограничений CQLinq, который будет проверяться при каждом анализе. Отчет будет предупреждать вас каждый раз, когда ограничение нарушается. Эта функция делает возможным автоматический дизайн и регрессионный тест качества.

  • Улучшена ремонтопригодность кода. Это положительно влияет на производительность команд разработчиков.
  • Со временем разработчики узнают правила, которым нужно следовать, и их навыки улучшатся .
  • Архитекторы могут предвидеть влияние изменений кода. Правильные решения приняты рано .
  • Поскольку качество проверяется автоматически и постоянно с упором на последние изменения, как в Visual Studio, так и в DevOps, команда создает лучший код .
  • Руководители получают контроль над затратами и рисками благодаря освещению наиболее важных фактов и тенденций развития.

CppDepend — единственное расширение Visual Studio, которое может сообщить разработчику, что за последний час
только что написанный код привел к возникновению задолженности, которая, например, будет стоить около 30 минут, если ее придется погасить позже .
Зная это, разработчик может исправить код еще до того, как передать его в систему управления версиями.

Правила кода CppDepend — это запросы C # LINQ, которые можно создать и настроить за считанные секунды.
Эти запросы содержат формулы C # для вычисления точных оценок технического долга .

Набор правил по умолчанию предлагает более сотни правил кода, которые обнаруживают
широкий спектр кода пахнет , включая запутанный код, мертвый код, критические изменения API и неправильное использование ООП.

Как статический анализатор CppDepend, скорее всего, обнаружит сотни или даже тысячи проблем, влияющих на реальную базу кода.Остановить работу, чтобы попытаться исправить все проблемы на несколько недель, было бы совершенно непродуктивно.

Вот почему CppDepend — единственный инструмент, который предлагает базовый уровень в Visual Studio .
Инструмент оценивает прогресс технического долга по сравнению с исходным уровнем.

Последний код пахнет , которые следует исправить перед фиксацией любого кода в системе управления версиями, выделены в Visual Studio.
Затем их можно исправить еще до того, как они достигнут исходного сервера.

Как следствие, качество кода остается под контролем без каких-либо крупных предварительных вложений .

RAII — cppreference.com

Resource Acquisition Is Initialization or RAII, это метод программирования C ++ [1] [2] , который связывает жизненный цикл ресурса, который должен быть получен перед использованием (выделенная память кучи, поток выполнения, открытый сокет , открытый файл, заблокированный мьютекс, дисковое пространство, соединение с базой данных — все, что существует в ограниченном количестве) до времени жизни объекта.

RAII гарантирует, что ресурс доступен для любой функции, которая может получить доступ к объекту (доступность ресурса является инвариантом класса, что исключает избыточные тесты времени выполнения).Это также гарантирует, что все ресурсы будут высвобождены, когда время жизни их контролирующего объекта закончится, в порядке, обратном их получению. Аналогичным образом, если получение ресурса не удается (конструктор завершает работу с исключением), все ресурсы, полученные каждым полностью сконструированным членом и базовым подобъектом, освобождаются в порядке, обратном инициализации. При этом используются основные функции языка (время жизни объекта, выход из области видимости, порядок инициализации и раскрутка стека) для устранения утечек ресурсов и обеспечения безопасности исключений.Другое название этого метода — Scope-Bound Resource Management (SBRM), после основного варианта использования, когда время жизни объекта RAII заканчивается из-за выхода из области действия.

RAII можно резюмировать следующим образом:

  • инкапсулируют каждый ресурс в класс, где
  • конструктор получает ресурс и устанавливает все инварианты класса или генерирует исключение, если это невозможно сделать,
  • деструктор освобождает ресурс и никогда не генерирует исключения;
  • всегда использовать ресурс через экземпляр класса RAII, который либо
  • имеет автоматическую продолжительность хранения или сам временный срок службы, или
  • имеет время жизни, ограниченное временем жизни автоматического или временного объекта.

Семантика перемещения позволяет безопасно передавать владение ресурсами между объектами, в разных областях, в потоках и из потоков, сохраняя при этом безопасность ресурсов.

Классы с функциями-членами open () / close (), lock () / unlock () или init () / copyFrom () / destroy () являются типичными примерами классов, не относящихся к RAII:

 std :: mutex m;

недействительно плохо ()
{
    m.lock (); // получаем мьютекс
    f (); // если f () выдает исключение, мьютекс никогда не освобождается
    если (! all_ok ()) вернуться; // досрочный возврат, мьютекс никогда не освобождается
    m.unlock (); // если bad () достигает этого оператора, мьютекс освобождается
}

недействительно хорошо ()
{
    std :: lock_guard  lk (м); // Класс RAII: получение мьютекса - это инициализация
    f (); // если f () выдает исключение, мьютекс освобождается
    если (! all_ok ()) вернуться; // досрочный возврат, мьютекс освобождается
} // если good () возвращает нормально, мьютекс освобождается 

[править] Стандартная библиотека

Классы библиотеки C ++, которые управляют своими собственными ресурсами, следуют RAII: std :: string, std :: vector, std :: thread и многие другие получают свои ресурсы в конструкторах (которые генерируют исключения при ошибках), освобождают их в своих деструкторах ( которые никогда не выбрасываются) и не требуют явной очистки.

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

[править] Примечания

RAII не применяется к управлению ресурсами, которые не были получены до использования: время ЦП, ядра и емкость кеш-памяти, емкость энтропийного пула, пропускная способность сети, потребление электроэнергии, стековая память.

[править] Ссылки

  1. ↑ RAII в FAQ Страуструпа по C ++
  2. ↑ C ++ Core Guidelines E.6 «Используйте RAII для предотвращения утечек»

Программы повременных ставок: Закон о восстановлении

Многие из проектов инвестиционного гранта Smart Grid (SGIG), которые инвестируют в интеллектуальные счетчики, также выбирают
знакомить своих клиентов с различными формами повременных тарифных программ.Эти программы включают
от времени использования до ценообразования в реальном времени и часто упоминаются такими терминами, как
дифференцированные по времени розничные тарифы, вариативное ценообразование, расширенные программы ценообразования и
изменяющиеся во времени розничные цены. Мы называем все это программами ставок на основе времени — в
какие цены меняются со временем, и разные цены действуют в разное время в разные
дней.

Поскольку электроэнергетические компании, как правило, являются монопольными предприятиями, регулирующие органы утверждают
цены на электроэнергию для потребителей.Эти цены называются тарифами на электроэнергию или
тарифы. Иногда проводится различие между ценами или ставками, с одной стороны, и тарифами на
другой. В этих случаях тариф представляет собой утвержденный набор различных ставок, которые
коммунальные службы предлагают конкретным, но различным типам клиентов (например, ценообразование в реальном времени для крупных
коммерческие и промышленные потребители по сравнению с фиксированной ставкой для бытовых потребителей с низким доходом).

Тарифы на электроэнергию могут зависеть от детализации или точности данных об использовании электроэнергии.
что регистрируется счетчиком клиента.Потребители массового рынка (т. Е. Жилые и
небольшой коммерческий) в подавляющем большинстве имеют счетчики массового использования с одним регистром данных, которые
просто накапливает использование с течением времени. Таким образом, этим клиентам может быть выставлен счет только за
электричество, которое они используют согласно следующим типам ценообразования:

  • Фиксированные ставки — все использование в течение заданного периода времени (например, 30-дневный биллинг
    цикл) взимается по той же ставке; или
  • Уровневые тарифы — обычно взимаются разные цены в зависимости от блоков использования
    (е.g., первые 500 кВтч против следующих 500 кВтч) в течение заданного периода времени (например, 30-дневный счет
    цикл).

Такие конструкции тарифов на электроэнергию не отражают изменчивость во времени (например, от часа к часу,
посуточно, от сезона к сезону) в стоимости производства электроэнергии.

Используя интеллектуальные счетчики, коммунальные предприятия теперь могут регистрировать потребление электроэнергии на гораздо большем количестве
часто (например, каждые 15 минут), что позволяет клиентам массового рынка, у которых раньше
счетчики массового потребления, которые будут представлены в новых типах программ ценообразования, которые лучше отражают эти
различия во времени в стоимости производства электроэнергии.

Формы повременных тарифных программ включают:

  • Ценообразование по времени использования (TOU) — обычно применяется к использованию по широким блокам
    часов (например, в пиковое время = 6 часов в летний будний день после обеда; в непиковое время = все остальные часы в
    летние месяцы), где цена для каждого периода заранее определена и постоянна.
  • Цены в реальном времени (RTP) — цены обычно применяются к использованию на
    почасовая оплата.
  • Variable Peak Pricing (VPP) — гибрид времени использования и реального времени
    ценообразование, когда различные периоды ценообразования определены заранее (например,г., пик = 6
    часы для летних будних дней после обеда; внепиковый = все остальные часы в летние месяцы), но
    цена, установленная для периода максимальной нагрузки, зависит от коммунальных предприятий и рыночных условий.
  • Критическое пиковое ценообразование (CPP) — когда коммунальные предприятия наблюдают или ожидают высоких цен
    оптовые рыночные цены или аварийные состояния энергосистемы, они могут вызывать критические события
    в течение определенного периода времени (например, с 15:00 до 18:00 в жаркий летний будний день),
    цена на электроэнергию в эти периоды времени существенно повышается.Два варианта
    существует такой тип тарифного плана: тот, в котором время и продолжительность повышения цены
    заранее определено, когда вызываются события, и другое, где время и продолжительность цены
    увеличение может варьироваться в зависимости от потребности электросети в снижении нагрузки;
  • Критические пиковые скидки (CPR) — когда коммунальные предприятия наблюдают или ожидают высоких
    оптовые рыночные цены или аварийные состояния энергосистемы, они могут вызывать критические события
    в заранее определенные периоды времени (например,г., 15:00 — 18:00 летние будние дни после обеда),
    цена на электроэнергию в эти периоды времени остается прежней, но покупатель
    возмещается по единой заранее определенной сумме за любое снижение потребления по сравнению с тем, что
    коммунальное предприятие посчитало, что потребитель будет потреблять.

Все программы ценообразования, перечисленные выше, за исключением TOU, также обычно называются
динамическое ценообразование, потому что цены неизвестны заранее. Тарифы TOU не
тип динамического ценообразования, потому что тарифный план предопределен и статичен.Динамический
программы ценообразования позволяют клиентам и коммунальным предприятиям получить больше преимуществ от сетей и оптовых продаж.
изменчивость рынка и возможности клиентских систем умных сетей. Все эти формы
программ повременных тарифов стали возможными благодаря инвестициям и установке интеллектуальных счетчиков.
В настоящее время большинство проектов SGIG, которые включают программы повременных ставок, относительно
небольшие пилотные программы, хотя несколько проектов с интеллектуальными счетчиками и тарифами на время использования
включают общесистемную реализацию.

В таблице ниже поясняется типология, используемая для категорий программ SGIG с повременной оплатой.

Квартира Нет
Квартира Критическая пиковая цена Критическая пиковая цена
Квартира Скидки за критический пик Скидки за критический пик
Ярусный Нет
Ярусный Критическая пиковая цена Критическая пиковая цена
Ярусный Скидки за критический пик Скидки за критический пик
Срок использования Нет
Срок использования Критическая пиковая цена Критическая пиковая цена
Срок использования Скидки за критический пик Скидки за критический пик
Цены в реальном времени Цены в реальном времени
Цены в реальном времени Цены в реальном времени Цены в реальном времени
Цены в реальном времени Скидки за критический пик Цены в реальном времени

<< НАЗАД

cmake-buildsystem (7) — CMake 3.20.0-rc4 Документация

Система сборки на основе CMake организована как набор высокоуровневых логических
цели. Каждая цель соответствует исполняемому файлу или библиотеке, или
— настраиваемая цель, содержащая настраиваемые команды. Зависимости между
цели выражаются в системе сборки для определения порядка сборки
и правила возрождения в ответ на изменения.

Исполняемые файлы и библиотеки определяются с помощью add_executable ()
и add_library () команд.Полученные двоичные файлы имеют
соответствующий PREFIX , SUFFIX и расширения для целевой платформы.
Зависимости между двоичными целями выражаются с помощью
target_link_libraries () команда:

 add_library (архив archive.cpp zip.cpp lzma.cpp)
add_executable (zipapp zipapp.cpp)
target_link_libraries (архив zipapp)
 

архив определяется как STATIC библиотека — архив, содержащий объекты
составлено из архива .cpp , zip.cpp и lzma.cpp . zipapp
определяется как исполняемый файл, сформированный путем компиляции и связывания zipapp.cpp .
При компоновке исполняемого файла zipapp статическая библиотека архива
соединен в.

Двоичные исполняемые файлы

Команда add_executable () определяет исполняемую цель:

 add_executable (mytool mytool.cpp)
 

Команды, такие как add_custom_command () , которые генерируют правила, которые будут
запускать во время сборки может прозрачно использовать ИСПОЛНИТЕЛЬНЫЙ
target как исполняемый файл COMMAND .Правила системы сборки гарантируют, что
исполняемый файл создается до попытки запустить команду.

Типы двоичных библиотек

Обычные библиотеки

По умолчанию команда add_library () определяет библиотеку STATIC ,
если не указан тип. Тип можно указать при использовании команды:

 add_library (архив SHARED archive.cpp zip.cpp lzma.cpp)
 
 add_library (архив STATIC archive.cpp zip.cpp lzma.cpp)
 

Переменная BUILD_SHARED_LIBS может быть включена для изменения
поведение add_library () для создания разделяемых библиотек по умолчанию.

В контексте определения системы сборки в целом, это в значительной степени
не имеет значения, являются ли конкретные библиотеки SHARED или STATIC
команды, спецификации зависимостей и другие API работают аналогично
независимо от типа библиотеки. Тип библиотеки MODULE :
отличается тем, что обычно не связан с — не используется в
правая часть команды target_link_libraries () .
Это тип, который загружается как плагин с использованием методов времени выполнения.Если библиотека не экспортирует неуправляемые символы (например, Windows
ресурс DLL, C ++ / CLI DLL), требуется, чтобы библиотека не была
ОБЩАЯ библиотека , потому что CMake ожидает экспорта ОБЩИХ библиотек
хотя бы один символ.

 add_library (архив МОДУЛЬ 7z.cpp)
 
Apple Frameworks

Библиотека SHARED может быть помечена рамкой FRAMEWORK
target для создания пакета MacOS или iOS Framework.
Библиотека с целевым свойством FRAMEWORK также должна установить
FRAMEWORK_VERSION целевое свойство.Это свойство обычно
установлено значение «A» по соглашениям macOS.
MACOSX_FRAMEWORK_IDENTIFIER устанавливает CFBundleIdentifier ключ
и однозначно идентифицирует комплект.

 add_library (MyFramework SHARED MyFramework.cpp)
set_target_properties (MyFramework СВОЙСТВА
  РАМКИ ИСТИНА
  FRAMEWORK_VERSION A # Версия "A" является соглашением для macOS
  MACOSX_FRAMEWORK_IDENTIFIER org.cmake.MyFramework
)
 
Библиотеки объектов

Тип библиотеки OBJECT определяет неархивную коллекцию объектных файлов.
в результате компиляции данных исходных файлов.Коллекция объектных файлов
может использоваться в качестве исходных входов для других целей с помощью синтаксиса
$ . Это
выражение генератора , которое может быть
используется для передачи содержимого библиотеки OBJECT другим целевым объектам:

 add_library (архив OBJECT archive.cpp zip.cpp lzma.cpp)

add_library (archiveExtras STATIC $  extras.cpp)

add_executable (test_exe $  test.cpp)
 

На этапе связывания (или архивирования) этих других целей будет использоваться объект
Коллекция файлов в дополнение к файлам из собственных источников.

В качестве альтернативы библиотеки объектов могут быть связаны с другими целями:

 add_library (архив OBJECT archive.cpp zip.cpp lzma.cpp)

add_library (archiveExtras STATIC extras.cpp)
target_link_libraries (archiveExtras ПУБЛИЧНЫЙ архив)

add_executable (test_exe test.cpp)
target_link_libraries (архив test_exe)
 

На этапе связывания (или архивирования) этих других целей будет использоваться объект
файлы из библиотек OBJECT , которые напрямую связаны . Кроме того,
требования к использованию библиотек OBJECT будут соблюдены при компиляции
источники в этих других целях.Кроме того, эти требования к использованию
будет транзитивно распространяться на иждивенцев этих других целей.

Библиотеки объектов не могут использоваться как TARGET при использовании
add_custom_command (TARGET) подпись команды. Тем не мение,
список объектов может использоваться командой add_custom_command (OUTPUT)
или файл (GENERATE) , используя $ .

target_include_directories () , target_compile_definitions ()
и target_compile_options () команды определяют спецификации сборки
и требования к использованию двоичных целей.Команды заполняют
INCLUDE_DIRECTORIES , COMPILE_DEFINITIONS и
COMPILE_OPTIONS целевых свойств соответственно и / или
INTERFACE_INCLUDE_DIRECTORIES , INTERFACE_COMPILE_DEFINITIONS
и INTERFACE_COMPILE_OPTIONS целевых свойств.

Каждая из команд имеет режим PRIVATE , PUBLIC и INTERFACE . В
ЧАСТНЫЙ Режим заполняет только не INTERFACE_ вариант цели
свойство, а режим INTERFACE заполняет только варианты INTERFACE_ .Режим PUBLIC заполняет оба варианта соответствующего целевого свойства.
Каждую команду можно вызывать с многократным использованием каждого ключевого слова:

 target_compile_definitions (архив
  ЧАСТНОЕ ЗДАНИЕ_WITH_LZMA
  ИНТЕРФЕЙС USING_ARCHIVE_LIB
)
 

Обратите внимание, что требования к использованию не предназначены для того, чтобы
используйте конкретный COMPILE_OPTIONS или
COMPILE_DEFINITIONS и т. Д. Только для удобства. Содержание
свойства должны соответствовать требованиям , а не просто рекомендациям или
удобство.

См. Раздел «Создание перемещаемых пакетов»
cmake-packages (7) инструкция по дополнительному уходу
что необходимо учитывать при указании требований к использованию при создании
пакеты для распространения.

Целевые свойства

Содержимое INCLUDE_DIRECTORIES ,
COMPILE_DEFINITIONS и COMPILE_OPTIONS цель
свойства используются надлежащим образом при компиляции исходных файлов
двоичная цель.

Записи в INCLUDE_DIRECTORIES добавляются в строку компиляции
с префиксами -I или -система и в порядке появления в
стоимость имущества.

Записи в COMPILE_DEFINITIONS имеют префикс -D или
/ D и добавлен в строку компиляции в неопределенном порядке. В
DEFINE_SYMBOL Целевое свойство также добавлено как компиляция
определение как особый удобный случай для SHARED и MODULE
библиотеки целей.

Записи в COMPILE_OPTIONS экранируются для оболочки и добавляются
в порядке появления в стоимости свойства. Несколько вариантов компиляции имеют
специальная отдельная обработка, например POSITION_INDEPENDENT_CODE .

Содержимое INTERFACE_INCLUDE_DIRECTORIES ,
INTERFACE_COMPILE_DEFINITIONS и
INTERFACE_COMPILE_OPTIONS целевых свойств
Требования к использованию — они определяют контент, который потребители
должны использоваться для правильной компиляции и связывания с целью, на которой они появляются.Для любой двоичной цели содержимое каждого свойства INTERFACE_ на
каждая цель, указанная в команде target_link_libraries () , является
израсходовано:

Набор

 (srcs archive.cpp zip.cpp)
если (LZMA_FOUND)
  список (ДОБАВИТЬ srcs lzma.cpp)
endif ()
add_library (ОБЩИЙ архив $ {srcs})
если (LZMA_FOUND)
  # Исходники архивной библиотеки скомпилированы с -DBUILDING_WITH_LZMA
  target_compile_definitions (архив PRIVATE BUILDING_WITH_LZMA)
endif ()
target_compile_definitions (архив ИНТЕРФЕЙСА USING_ARCHIVE_LIB)

add_executable (потребитель)
# Свяжите потребителя с архивом и изучите его требования к использованию.Потребитель
# исполняемые файлы скомпилированы с -DUSING_ARCHIVE_LIB.
target_link_libraries (потребительский архив)
 

Поскольку обычно требуется, чтобы исходный каталог и соответствующий
каталог сборки добавляется в INCLUDE_DIRECTORIES ,
CMAKE_INCLUDE_CURRENT_DIR Переменная может быть включена для удобного
добавьте соответствующие каталоги в INCLUDE_DIRECTORIES из
все цели. Переменная CMAKE_INCLUDE_CURRENT_DIR_IN_INTERFACE
можно включить, чтобы добавить соответствующие каталоги в
INTERFACE_INCLUDE_DIRECTORIES всех целей.Это использует
целей в нескольких разных каталогах, удобных благодаря использованию
target_link_libraries () команда.

Требования к переходному использованию

Требования использования цели могут транзитивно распространяться на иждивенцев.
Команда target_link_libraries () имеет PRIVATE ,
INTERFACE и PUBLIC ключевые слова для управления распространением.

 add_library (архив archive.cpp)
target_compile_definitions (архив ИНТЕРФЕЙСА USING_ARCHIVE_LIB)

add_library (сериализация сериализации.cpp)
target_compile_definitions (ИНТЕРФЕЙС сериализации USING_SERIALIZATION_LIB)

add_library (archiveExtras extras.cpp)
target_link_libraries (archiveExtras ПУБЛИЧНЫЙ архив)
target_link_libraries (archiveExtras ЧАСТНАЯ сериализация)
# archiveExtras скомпилирован с -DUSING_ARCHIVE_LIB
# и -DUSING_SERIALIZATION_LIB

add_executable (потребитель consumer.cpp)
# потребитель скомпилирован с -DUSING_ARCHIVE_LIB
target_link_libraries (потребительский архивExtras)
 

Поскольку архив является зависимостью PUBLIC от архива Кроме ,
требования к его использованию распространяются и на потребителей .Потому что
сериализация — это ЧАСТНАЯ зависимость от архива Дополнительные , использование
требования к нему не распространяются на потребителя .

Как правило, зависимость должна быть указана при использовании
target_link_libraries () с ключевым словом PRIVATE , если оно используется
только реализация библиотеки, а не в заголовочных файлах. Если
зависимость дополнительно используется в файлах заголовков библиотеки (например, для
наследование классов), то он должен быть указан как зависимость PUBLIC .Зависимость, которая не используется реализацией библиотеки, а только
его заголовки должны быть указаны как зависимость INTERFACE . В
target_link_libraries () Команда может быть вызвана с несколькими использованиями
каждое ключевое слово:

 target_link_libraries (архивExtras
  ОБЩЕСТВЕННЫЙ архив
  ЧАСТНАЯ сериализация
)
 

Требования к использованию распространяются путем чтения вариантов INTERFACE_
целевых свойств из зависимостей и добавление значений в
не INTERFACE_ варианты операнда.Например,
INTERFACE_INCLUDE_DIRECTORIES Считывается зависимостей и
добавляется к INCLUDE_DIRECTORIES операнда. В случаях
где порядок актуален и поддерживается, а порядок, вытекающий из
target_link_libraries () вызовов не позволяет корректную компиляцию,
использование соответствующей команды для установки свойства напрямую может обновить
порядок.

Например, если необходимо указать связанные библиотеки для цели
в порядке lib1 lib2 lib3 , но включаемые каталоги должны
указывать в порядке lib3 lib1 lib2 :

 target_link_libraries (myExe lib1 lib2 lib3)
target_include_directories (myExe
  ЧАСТНЫЙ $ )
 

Обратите внимание, что при указании требований к использованию для целей необходимо соблюдать осторожность.
который будет экспортирован для установки с помощью установки (ЭКСПОРТ)
команда.См. «Создание пакетов» для получения дополнительной информации.

Свойства совместимого интерфейса

Некоторые свойства цели должны быть совместимы между целью и
интерфейс каждой зависимости. Например,
POSITION_INDEPENDENT_CODE целевое свойство может указывать
логическое значение, указывающее, следует ли компилировать цель как
позиционно-независимый-код, который имеет последствия, зависящие от платформы.
Цель также может указывать требования к использованию
INTERFACE_POSITION_INDEPENDENT_CODE , чтобы сообщить, что
потребители должны быть скомпилированы как независимый от позиции код.

 add_executable (exe1 exe1.cpp)
set_property (TARGET exe1 PROPERTY POSITION_INDEPENDENT_CODE ON)

add_library (lib1 ОБЩАЯ lib1.cpp)
set_property (TARGET lib1 PROPERTY INTERFACE_POSITION_INDEPENDENT_CODE ON)

add_executable (exe2 exe2.cpp)
target_link_libraries (exe2 lib1)
 

Здесь и exe1 , и exe2 будут скомпилированы как позиционно-независимый код.
lib1 также будет скомпилирован как независимый от позиции код, потому что это
настройка по умолчанию для библиотек SHARED .Если зависимости конфликтуют,
несовместимые требования cmake (1) выдает диагностику:

 add_library (lib1 ОБЩАЯ lib1.cpp)
set_property (TARGET lib1 PROPERTY INTERFACE_POSITION_INDEPENDENT_CODE ON)

add_library (lib2 ОБЩАЯ lib2.cpp)
set_property (TARGET lib2 PROPERTY INTERFACE_POSITION_INDEPENDENT_CODE OFF)

add_executable (exe1 exe1.cpp)
target_link_libraries (exe1 lib1)
set_property (TARGET exe1 PROPERTY POSITION_INDEPENDENT_CODE OFF)

add_executable (exe2 exe2.cpp)
target_link_libraries (exe2 lib1 lib2)
 

Требование lib1 INTERFACE_POSITION_INDEPENDENT_CODE не выполняется
«совместим» со свойством POSITION_INDEPENDENT_CODE для
цель exe1 .Библиотека требует, чтобы потребители были построены как
позиционно-независимый-код, в то время как исполняемый файл указывает, что он не построен как
позиционно-независимый-код, поэтому выдается диагностика.

Требования lib1 и lib2 несовместимы. Один из них
требует, чтобы потребители были построены как независимый от позиции код, в то время как
другой требует, чтобы потребители не строились как позиционно-независимый код.
Поскольку exe2 ссылается на оба, и они конфликтуют, сообщение об ошибке CMake
выдан:

 Ошибка CMake: свойство INTERFACE_POSITION_INDEPENDENT_CODE библиотеки lib2 делает
не согласен с уже определенным значением POSITION_INDEPENDENT_CODE
для "exe2".

Чтобы быть «совместимым», свойство POSITION_INDEPENDENT_CODE ,
if set должен быть либо таким же в логическом смысле, что и
INTERFACE_POSITION_INDEPENDENT_CODE свойство всех транзитивных
указанные зависимости, на которых установлено это свойство.

Это свойство «требования к совместимому интерфейсу» может быть распространено на другие
properties, указав свойство в содержимом
COMPATIBLE_INTERFACE_BOOL целевое свойство. Каждое указанное свойство
должны быть совместимы между потребляющей целью и соответствующим свойством
с префиксом INTERFACE_ из каждой зависимости:

 add_library (lib1Version2 ОБЩАЯ lib1_v2.cpp)
set_property (TARGET lib1Version2 PROPERTY INTERFACE_CUSTOM_PROP ON)
set_property (ЦЕЛЬ lib1Version2 ДОБАВИТЬ СВОЙСТВО
  COMPATIBLE_INTERFACE_BOOL CUSTOM_PROP
)

add_library (lib1Version3 ОБЩАЯ lib1_v3.cpp)
set_property (TARGET lib1Version3 PROPERTY INTERFACE_CUSTOM_PROP OFF)

add_executable (exe1 exe1.cpp)
target_link_libraries (exe1 lib1Version2) # CUSTOM_PROP будет включен

add_executable (exe2 exe2.cpp)
target_link_libraries (exe2 lib1Version2 lib1Version3) # Диагностика
 

Небулевские свойства также могут участвовать в «совместимом интерфейсе»
вычисления.Свойства, указанные в
COMPATIBLE_INTERFACE_STRING
свойство должно быть либо не указано, либо сравниваться с той же строкой среди
все транзитивно указанные зависимости. Это может быть полезно для обеспечения
что несколько несовместимых версий библиотеки не связаны друг с другом
через переходные требования цели:

 add_library (lib1Version2 ОБЩАЯ lib1_v2.cpp)
set_property (ЦЕЛЬ lib1Version2 ИНТЕРФЕЙС СВОЙСТВА_LIB_VERSION 2)
set_property (ЦЕЛЬ lib1Version2 ДОБАВИТЬ СВОЙСТВО
  COMPATIBLE_INTERFACE_STRING LIB_VERSION
)

add_library (lib1Version3 ОБЩАЯ lib1_v3.cpp)
set_property (TARGET lib1Version3 PROPERTY INTERFACE_LIB_VERSION 3)

add_executable (exe1 exe1.cpp)
target_link_libraries (exe1 lib1Version2) # LIB_VERSION будет "2"

add_executable (exe2 exe2.cpp)
target_link_libraries (exe2 lib1Version2 lib1Version3) # Диагностика
 

Целевое свойство COMPATIBLE_INTERFACE_NUMBER_MAX указывает
этот контент будет оцениваться численно, и максимальное число среди всех
Указано будет рассчитано:

 add_library (lib1Version2 ОБЩАЯ lib1_v2.cpp)
set_property (TARGET lib1Version2 PROPERTY INTERFACE_CONTAINER_SIZE_REQUIRED 200)
set_property (ЦЕЛЬ lib1Version2 ДОБАВИТЬ СВОЙСТВО
  COMPATIBLE_INTERFACE_NUMBER_MAX CONTAINER_SIZE_REQUIRED
)

add_library (lib1Version3 ОБЩАЯ lib1_v3.cpp)
set_property (TARGET lib1Version3 PROPERTY INTERFACE_CONTAINER_SIZE_REQUIRED 1000)

add_executable (exe1 exe1.cpp)
# CONTAINER_SIZE_REQUIRED будет «200»
target_link_libraries (exe1 lib1Version2)

add_executable (exe2 exe2.cpp)
# CONTAINER_SIZE_REQUIRED будет «1000»
target_link_libraries (exe2 lib1Version2 lib1Version3)
 

Аналогично, COMPATIBLE_INTERFACE_NUMBER_MIN может использоваться для
вычислить числовое минимальное значение для свойства по зависимостям.

Каждое вычисленное «совместимое» значение свойства может быть прочитано в потребителе по адресу
время генерации с использованием выражений генератора.

Обратите внимание, что для каждого иждивенца набор свойств, указанных в каждом
совместимое свойство интерфейса не должно пересекаться с набором, указанным в
любые другие свойства.

Отладка источника свойства

Поскольку спецификации сборки могут определяться зависимостями, отсутствие
локальность кода, который создает цель, и код, который отвечает за
установка спецификаций сборки может затруднить понимание кода. cmake (1) предоставляет средство отладки для печати источника
содержимое свойств, которое может определяться зависимостями. Свойства
которые можно отлаживать, перечислены в
CMAKE_DEBUG_TARGET_PROPERTIES документация по переменной:

 установить (CMAKE_DEBUG_TARGET_PROPERTIES
  INCLUDE_DIRECTORIES
  COMPILE_DEFINITIONS
  POSITION_INDEPENDENT_CODE
  CONTAINER_SIZE_REQUIRED
  LIB_VERSION
)
add_executable (exe1 exe1.cpp)
 

В случае свойств, перечисленных в COMPATIBLE_INTERFACE_BOOL или
COMPATIBLE_INTERFACE_STRING , выходные данные отладки показывают, какая цель
отвечал за установку свойства, а также за другие зависимости
определил свойство.В случае
COMPATIBLE_INTERFACE_NUMBER_MAX и
COMPATIBLE_INTERFACE_NUMBER_MIN , выходные данные отладки показывают
значение свойства из каждой зависимости и определяет, определяет ли значение
новый экстрим.

Спецификация сборки с выражениями генератора

Спецификации сборки могут использовать
генератор выражений , содержащий
контент, который может быть условным или известен только во время создания. Например,
вычисленное «совместимое» значение свойства может быть прочитано с помощью
TARGET_PROPERTY выражение:

 add_library (lib1Version2 ОБЩАЯ lib1_v2.cpp)
set_property (ЦЕЛЬ lib1Version2 PROPERTY
  INTERFACE_CONTAINER_SIZE_REQUIRED 200)
set_property (ЦЕЛЬ lib1Version2 ДОБАВИТЬ СВОЙСТВО
  COMPATIBLE_INTERFACE_NUMBER_MAX CONTAINER_SIZE_REQUIRED
)

add_executable (exe1 exe1.cpp)
target_link_libraries (exe1 lib1Version2)
target_compile_definitions (exe1 ЧАСТНЫЙ
    CONTAINER_SIZE = $ 
)
 

В этом случае исходные файлы exe1 будут скомпилированы с
-DCONTAINER_SIZE = 200 .

Спецификации сборки, определенные конфигурацией, могут быть легко установлены с помощью
выражение генератора CONFIG .

 target_compile_definitions (exe1 ЧАСТНЫЙ
    $ <$ : DEBUG_BUILD>
)
 

Параметр CONFIG сравнивается без учета регистра с конфигурацией
в процессе постройки. При наличии ИМПОРТНЫХ мишеней содержание
MAP_IMPORTED_CONFIG_DEBUG также
объясняется этим выражением.

Некоторые системы сборки, генерируемые командой cmake (1) , имеют заранее заданный
конфигурация сборки устанавливается в переменной CMAKE_BUILD_TYPE . В
buildsystem для IDE, таких как Visual Studio и Xcode.
независимо от конфигурации сборки и фактической конфигурации сборки
неизвестно до времени сборки. Следовательно, код типа

 строка (TOLOWER $ {CMAKE_BUILD_TYPE} _type)
if (_type СТРЕВАЛЬНАЯ отладка)
  target_compile_definitions (exe1 ЧАСТНАЯ ОТЛАДКА_BUILD)
endif ()
 

может работать для Makefile Generators и Ninja
генераторы, но не переносится на генераторы IDE.Кроме того,
сопоставления конфигурации IMPORTED не учитываются
с таким кодом, поэтому его следует избегать.

Унарное выражение генератора TARGET_PROPERTY и выражение TARGET_POLICY
Генератор выражения оцениваются с использованием целевого контекста. Этот
означает, что спецификация требований к использованию может оцениваться по-разному на основе
на потребителя:

 add_library (lib1 lib1.cpp)
target_compile_definitions (ИНТЕРФЕЙС lib1
  $ <$ , EXECUTABLE>: LIB1_WITH_EXE>
  $ <$ , SHARED_LIBRARY>: LIB1_WITH_SHARED_LIB>
  $ <$ : CONSUMER_CMP0041_NEW>
)

add_executable (exe1, exe1.cpp)
target_link_libraries (exe1 lib1)

cmake_policy (НАБОР CMP0041 NEW)

add_library (shared_lib shared_lib.cpp)
target_link_libraries (shared_lib lib1)
 

Исполняемый файл exe1 будет скомпилирован с помощью -DLIB1_WITH_EXE , в то время как
shared_lib разделяемая библиотека будет скомпилирована с -DLIB1_WITH_SHARED_LIB
и -DCONSUMER_CMP0041_NEW , потому что политика CMP0041 является
NEW в точке, где создается цель shared_lib .

Выражение BUILD_INTERFACE охватывает требования, которые используются только тогда, когда
потребляется из цели в той же системе сборки или когда потребляется из цели
экспортируется в каталог сборки с помощью команды export () . В
INSTALL_INTERFACE Выражение обертывает требования, которые используются только тогда, когда
потребляется из целевого объекта, который был установлен и экспортирован с
установить (ЭКСПОРТ) команда:

 add_library (ClimbingStats climbingstats.cpp)
target_compile_definitions (ИНТЕРФЕЙС ClimbingStats
  $ 
  $ 
)
установить (ЦЕЛИ ClimbingStats EXPORT libExport $ {InstallArgs})
установить (ЭКСПОРТ libExport NAMESPACE Upstream ::
        НАЗНАЧЕНИЕ lib / cmake / ClimbingStats)
экспорт (EXPORT libExport NAMESPACE Upstream: :)

add_executable (exe1 exe1.cpp)
target_link_libraries (exe1 ClimbingStats)
 

В этом случае исполняемый файл exe1 будет скомпилирован с
-DClimbingStats_FROM_BUILD_LOCATION .Команды экспорта генерируют
ИМПОРТИРОВАНО целей с помощью INSTALL_INTERFACE или
BUILD_INTERFACE опущен, а маркер * _INTERFACE удален.
Отдельный проект, использующий пакет ClimbingStats , будет содержать:

 find_package (ТРЕБУЕТСЯ ClimbingStats)

add_executable (нижестоящий main.cpp)
target_link_libraries (Downstream Upstream :: ClimbingStats)
 

В зависимости от того, использовался ли пакет ClimbingStats из сборки
расположение или место установки, будет скомпилирована цель Downstream
либо с -DClimbingStats_FROM_BUILD_LOCATION , либо
-DClimbingStats_FROM_INSTALL_LOCATION .Подробнее о пакетах и
экспорт см. в руководстве cmake-packages (7) .

Включить каталоги и требования к использованию

Включаемые каталоги требуют особого внимания при указании использования
требования и при использовании с выражениями генератора. В
target_include_directories () Команда принимает как относительные, так и
абсолютные включают каталоги:

 add_library (lib1 lib1.cpp)
target_include_directories (lib1 ЧАСТНАЯ
  / абсолютный / путь
  относительный / путь
)
 

Относительные пути интерпретируются относительно исходного каталога, в котором
появляется команда.Относительные пути не допускаются в
INTERFACE_INCLUDE_DIRECTORIES из IMPORTED целей.

В случаях, когда используется нетривиальное выражение генератора,
INSTALL_PREFIX Выражение может использоваться в качестве аргумента
INSTALL_INTERFACE выражение. Это маркер замены, который
расширяется до префикса установки при импорте потребляющим проектом.

Требования к использованию каталогов Include обычно различаются в зависимости от дерева сборки.
и дерево установки. BUILD_INTERFACE и INSTALL_INTERFACE
выражения генератора могут использоваться для описания отдельных требований к использованию
в зависимости от места использования. Относительные пути разрешены в пределах
INSTALL_INTERFACE и интерпретируются относительно
префикс установки. Например:

 add_library (ClimbingStats climbingstats.cpp)
target_include_directories (ИНТЕРФЕЙС ClimbingStats
  $ 
  $ 
  $ 
  $  / $  / сгенерировано>
)
 

Предоставляются два удобных API, связанных с использованием каталогов включения.
требования.Переменная CMAKE_INCLUDE_CURRENT_DIR_IN_INTERFACE
может быть включен с эквивалентным эффектом:

 set_property (TARGET tgt APPEND PROPERTY INTERFACE_INCLUDE_DIRECTORIES
  $ 
)
 

за каждую пораженную цель. Удобство установки мишеней составляет
ВКЛЮЧАЕТ компонент DESTINATION с установкой (TARGETS)
команда:

 установка (ЦЕЛИ foo bar bat EXPORT tgts $ {dest_args}
  ВКЛЮЧАЕТ НАЗНАЧЕНИЕ включает
)
установить (EXPORT tgts $ {other_args})
установить (ФАЙЛЫ $ {headers} DESTINATION включают)
 

Это эквивалентно добавлению $ {CMAKE_INSTALL_PREFIX} / include к
INTERFACE_INCLUDE_DIRECTORIES каждого из установленных
ИМПОРТИРОВАНО целей при создании установкой (ЭКСПОРТ) .

Когда INTERFACE_INCLUDE_DIRECTORIES из
импортированная цель потребляется, записи в
свойство обрабатывается как СИСТЕМА включает каталоги, как если бы они были
перечисленных в INTERFACE_SYSTEM_INCLUDE_DIRECTORIES
зависимость. Это может привести к пропуску предупреждений компилятора для заголовков.
нашел в этих каталогах. Такое поведение для импортированных целей может
управляться установкой цели NO_SYSTEM_FROM_IMPORTED
собственности на потребителей импортных мишеней.

Если двоичная цель транзитивно связана с ОСНОВНОЙ ПРОГРАММОЙ macOS ,
Заголовки Каталог фреймворка также рассматривается как требование использования.
Это имеет тот же эффект, что и передача каталога фреймворка в качестве включаемого
каталог.

Библиотеки ссылок и выражения генератора

Как и спецификации сборки, библиотеки ссылок могут быть
задается условиями выражения генератора. Однако, поскольку потребление
требования к использованию основаны на сборе из связанных зависимостей, есть
дополнительное ограничение, заключающееся в том, что зависимости ссылок должны формировать «направленный
ациклический граф ».То есть, если ссылка на цель зависит от значения
целевое свойство, это целевое свойство может не зависеть от связанного
зависимости:

 add_library (lib1 lib1.cpp)
add_library (lib2 lib2.cpp)
target_link_libraries (lib1 PUBLIC
  $ <$ : lib2>
)
add_library (lib3 lib3.cpp)
set_property (TARGET lib3 PROPERTY INTERFACE_POSITION_INDEPENDENT_CODE ON)

add_executable (exe1 exe1.cpp)
target_link_libraries (exe1 lib1 lib3)
 

Как значение свойства POSITION_INDEPENDENT_CODE для
цель exe1 зависит от связанных библиотек ( lib3 ), а
край связывания exe1 определяется тем же
POSITION_INDEPENDENT_CODE свойство, график зависимостей выше
содержит цикл. cmake (1) выдает сообщение об ошибке.

Артефакты на выходе

Цели системы сборки, созданные с помощью add_library (), и
add_executable () команды создают правила для создания двоичных выходных данных.
Точное место вывода двоичных файлов можно определить только в
время генерации, потому что оно может зависеть от конфигурации сборки и
язык ссылок связанных зависимостей и т. д. TARGET_FILE ,
TARGET_LINKER_FILE и связанные выражения могут использоваться для доступа к
имя и расположение сгенерированных двоичных файлов.Эти выражения не работают
для библиотек OBJECT , однако, поскольку не создается ни одного файла
такими библиотеками, которые относятся к выражениям.

Есть три вида выходных артефактов, которые могут быть созданы целями.
как подробно описано в следующих разделах. Их классификация отличается
между платформами DLL и платформами, отличными от DLL. Все на базе Windows
системы, включая Cygwin, являются платформами DLL.

Артефакты вывода библиотеки

Выходной артефакт библиотеки целевой системы сборки может быть:

  • Загружаемый файл модуля (например,грамм. .dll или .so ) модуля
    цель библиотеки, созданная командой add_library ()
    с опцией МОДУЛЬ .

  • На платформах, отличных от DLL: файл общей библиотеки (например, .so или .dylib )
    целевой разделяемой библиотеки, созданной функцией add_library ()
    с опцией SHARED .

LIBRARY_OUTPUT_DIRECTORY и LIBRARY_OUTPUT_NAME
целевые свойства могут использоваться для управления расположением выходных артефактов библиотеки
и имена в дереве сборки.

Артефакты вывода архива

Архив выходной артефакт целевой системы сборки может быть:

  • Файл статической библиотеки (например, .lib или .a ) статического
    цель библиотеки, созданная командой add_library ()
    с опцией STATIC .

  • На платформах DLL: файл библиотеки импорта (например, .lib ) общего
    цель библиотеки, созданная командой add_library ()
    с опцией SHARED .Этот файл гарантированно существует только в том случае, если
    библиотека экспортирует хотя бы один неуправляемый символ.

  • На платформах DLL: файл библиотеки импорта (например, .lib )
    исполняемая цель, созданная командой add_executable ()
    когда установлено его целевое свойство ENABLE_EXPORTS .

  • В AIX: файл импорта компоновщика (например, .imp ) исполняемой цели
    создается командой add_executable () , когда ее
    ENABLE_EXPORTS целевое свойство установлено.

ARCHIVE_OUTPUT_DIRECTORY и ARCHIVE_OUTPUT_NAME
целевые свойства могут использоваться для управления расположением выходных артефактов архива
и имена в дереве сборки.

Некоторые целевые типы не представляют собой выходные данные системы сборки, а только входные данные.
такие как внешние зависимости, псевдонимы или другие артефакты, не связанные с сборкой. Псевдо
цели не представлены в созданной системе сборки.

Псевдонимы целей

Цель ALIAS — это имя, которое может использоваться взаимозаменяемо с
двоичное имя цели в контекстах только для чтения.Основной вариант использования ALIAS
target — это, например, исполняемые файлы модульного теста, сопровождающие библиотеку, которая
могут быть частью той же системы сборки или построены отдельно в зависимости от пользователя
конфигурация.

 add_library (lib1 lib1.cpp)
установить (ЦЕЛИ lib1 EXPORT lib1Export $ {dest_args})
установить (EXPORT lib1Export NAMESPACE Upstream :: $ {other_args})

add_library (Upstream :: lib1 АЛИАС lib1)
 

В другом каталоге мы можем безоговорочно ссылаться на Upstream :: lib1
цель, которая может быть целью IMPORTED из пакета или
ALIAS Цель , если она построена как часть той же системы сборки.

, если (НЕ ЦЕЛЬ Upstream :: lib1)
  find_package (ТРЕБУЕТСЯ lib1)
endif ()
add_executable (exe1 exe1.cpp)
target_link_libraries (exe1 Upstream :: lib1)
 

Цели ALIAS нельзя изменять, устанавливать или экспортировать. Они есть
полностью локально по отношению к описанию системы сборки. Имя можно проверить на
является ли это именем ALIAS , прочитав ALIASED_TARGET
имущество от него:

 get_target_property (_aliased Upstream :: lib1 ALIASED_TARGET)
если (_aliased)
  message (СТАТУС "Имя Upstream :: lib1 - НИКНЕЙМЫ для $ {_ aliased}.")
endif ()
 

Интерфейсные библиотеки

Целевой объект библиотеки INTERFACE не компилирует исходники и не
создать артефакт библиотеки на диске, поэтому у него нет МЕСТО .

Он может определять требования к использованию, такие как
INTERFACE_INCLUDE_DIRECTORIES ,
INTERFACE_COMPILE_DEFINITIONS ,
INTERFACE_COMPILE_OPTIONS ,
INTERFACE_LINK_LIBRARIES ,
ИСТОЧНИКИ_ИНТЕРФЕЙСА ,
и INTERFACE_POSITION_INDEPENDENT_CODE .Только режимы INTERFACE из target_include_directories () ,
target_compile_definitions () , target_compile_options () ,
target_sources () и target_link_libraries () команд
может использоваться с библиотеками INTERFACE .

Начиная с CMake 3.19, цель библиотеки INTERFACE может дополнительно содержать
исходные файлы. Библиотека интерфейса, содержащая исходные файлы, будет
включен в качестве цели сборки в сгенерированную систему сборки.Это не
компилировать исходники, но может содержать пользовательские команды для создания других источников.
Кроме того, IDE покажут исходные файлы как часть цели для
интерактивное чтение и редактирование.

Основным вариантом использования библиотек INTERFACE являются библиотеки только для заголовков.

 add_library (Собственный ИНТЕРФЕЙС
  src / eigen.h
  src / vector.h
  src / matrix.h
  )
target_include_directories (Собственный ИНТЕРФЕЙС
  $ 
  $ 
)

add_executable (exe1, exe1.cpp)
target_link_libraries (exe1 Eigen)
 

Здесь потребляются и используются требования к использованию из цели Eigen .
при компиляции, но не влияет на связывание.

Другой вариант использования — использовать полностью ориентированный на цель дизайн для использования
требования:

 add_library (изображение на ИНТЕРФЕЙСЕ)
set_property (TARGET pic_on PROPERTY INTERFACE_POSITION_INDEPENDENT_CODE ON)
add_library (pic_off ИНТЕРФЕЙС)
set_property (TARGET pic_off PROPERTY INTERFACE_POSITION_INDEPENDENT_CODE OFF)

add_library (enable_rtti ИНТЕРФЕЙС)
target_compile_options (enable_rtti ИНТЕРФЕЙС
  $ <$ , $ >: - rtti>
)

add_executable (exe1, exe1.cpp)
target_link_libraries (exe1 pic_on enable_rtti)
 

Таким образом, спецификация сборки exe1 полностью выражается как связанный
целей, а сложность специфичных для компилятора флагов инкапсулируется в
ИНТЕРФЕЙС целевой библиотеки.

INTERFACE библиотеки могут быть установлены и экспортированы. Любой контент, на который они ссылаются
необходимо установить отдельно:

Набор

 (Eigen_headers
  src / eigen.h
  src / vector.h
  src / matrix.h
  )
add_library (собственный ИНТЕРФЕЙС $ {Eigen_headers})
target_include_directories (Собственный ИНТЕРФЕЙС
  $ 
  $ 
)

установить (ЦЕЛИ Eigen EXPORT eigenExport)
установить (EXPORT eigenExport NAMESPACE Upstream ::
  НАЗНАЧЕНИЕ lib / cmake / Eigen
)
установить (ФАЙЛЫ $ {Eigen_headers}
  DESTINATION включает / Eigen
)
 

p0750r1: Потребление

1.Изменить историю

1.1. r0 → r1

Мелкие редакционные исправления.

[p0750r0] обсуждался SG1 в Альбукерке, есть оптимизм в отношении поиска
решение в соответствии с линиями, представленными в документе, но необходимо приложить дополнительные усилия
в предотвращении спекуляций компилятором.

2. Справочная информация

Порядок использования памяти, указанный в C ++ 11, не реализован ни одним
компилятор. Основная причина этого недостатка заключается в том, что спецификация создает
принципиальное несоответствие модели «зависимости» от исходного кода C ++
уровень и «зависимость» на уровне сборки, специфичной для ISA.

Программисты, нацеленные на большие системы, использовали «потребление» в различных
имена, по крайней мере, с середины 90-х годов. По мере развития оборудования то, что раньше было
детализация эзотерической памяти больших систем стала обычным явлением. Например,
Linux получил поддержку Read Copy Update [RCU] в октябре 2002 г.
с тех пор неуклонно росла [RCUUsage]. Порядок использования памяти является ключом к
Масштабируемость RCU.

Это предложение продолжает работу с:

  1. На пути к реализации и использованию списков memory_order_consume [p0098R1]
    множество способов, с помощью которых C ++ может раскрыть потребление.Особенно,
    раздел 7.11 является корнем текущего предложения.

  2. Маркировка memory_order_consume Цепочки зависимостей [p0462r1] расширяется на
    предыдущая статья. Особый интерес представляет раздел 3.2, в котором предлагается depends_ptr , на основе которого происходит API текущего предложения.

  3. Предложение по новому memory_order_consume Определение [p0190r3] имеет
    подробные сведения о каждой операции, поддерживаемой RCU.Этот список был
    критически важна для создания точной семантики, имеющейся в текущем предложении.

Текущее предложение отличается от предыдущих тем, что оно содержит
единый предлагаемый API, который, как известно, работает как минимум для одной кодовой базы. В самом деле,
он основан на работе в WebKit [Atomics], который успешно использует
потребляют упорядочивание памяти в C ++ на платформах ARM более года.

API WebKit был написан низкоуровневыми экспертами по компиляторам для их собственного использования с
ограниченная применимость по сравнению с RCU и необязательно удобна для пользователя.В
текущее предложение поэтому отличается следующим образом:

  • Меньше острых краев, чем у WebKit; и

  • Попытка поддержать больше вариантов использования, как описано в [p0462r1]

3. Что такое

потребляет ?

Consume предоставляет низкоуровневые зависимости архитектуры, доступные в слабой памяти
многоядерные системы. Например, он сопоставляется с тем, что ARM называет «адресом
правило зависимости », как описано в разделе 6.3 теста лакмусовой бумаги ARM и
Поваренная книга [Litmus]. POWER имеет аналогичную функцию ISA. На слабых ISA памяти,
Потребление позволяет писать код стиля выпуска / приобретения, где сторона читателя
не требует дополнительных ограждений. Заказ гарантируется созданием зависимостей от
сторона читателя между освобожденным местом и последующим читает, что
должно наблюдаться, чтобы это произошло после того, как значение этого местоположения было записано
писатель. «Зависимость» на уровне ISA означает, что вычисление значения
адрес последующих загрузок зависит от значения, загруженного из релиза
место расположения.

Реализация «продвигает» потребление для приобретения всегда допустимо, но в
в большинстве случаев это добавляет дополнительный забор.

Несмотря на то, что он широко используется во многих системах, создание API-интерфейса потребления, который
проста в использовании и остается сложной задачей, поскольку требует очень
точная сборка. Для обеспечения корректности текущее использование полагается на:

  • Благородное соглашение с авторами компилятора, чтобы избежать взлома кода;

  • Проверка человеком разборки скомпилированного кода;

  • Обширное тестирование;

  • Разумное применение встроенной сборки; и

  • Удача 🍀.

Это предложение ничем не отличается, за исключением того, что оно перекладывает эту нагрузку на
авторы компилятора и стандартной библиотеки. Эти люди намного лучше
положение для обеспечения правильности: они полагаются больше на инженерию, чем на удачу, чтобы
поддерживать правильность языка, потому что это буквально главная цель
их программное обеспечение.

4. Формулировка от C ++ 17

❡7 Оценка A имеет зависимость от оценки B, если

  1. значение A используется как операнд B, если:

    1. B — это вызов любой специализации std :: kill_dependency или
    2. A — левый операнд встроенного логического И && или логического ИЛИ || Оператор , или
    3. A — левый операнд условного оператора ?: , или
    4. A — левый операнд встроенного оператора запятой , ; или же
  2. A записывает скалярный объект или битовое поле M, B считывает значение, записанное A из M, и A упорядочивается перед B, или
  3. для некоторой оценки X, A имеет зависимость от X, а X несет зависимость от B.

[Примечание: «Несет зависимость от» — это подмножество «упорядочено до», и
точно так же строго внутри потока. — конечное примечание]

❡8 Оценка A упорядочивается по зависимости перед оценкой B, если

  1. A выполняет операцию освобождения атомарного объекта M, а в другом
    поток, B выполняет операцию потребления на M и считывает записанное значение
    любым побочным эффектом в последовательности высвобождения, обозначенной буквой A, или
  2. для некоторой оценки X, A упорядочивается по зависимости до того, как X и X будут переносить
    зависимость от B.

[Примечание. Отношение «предварительно упорядочено по зависимостям» аналогично
«Синхронизируется с», но использует выпуск / потребление вместо выпуска / получения.
— конечное примечание]

Приведенная выше формулировка и последующее использование терминов нуждаются в обновлении.

5. Прочие соображения

Следующее может также рассматриваться как часть этого предложения:

  1. Устарела передача memory_order_consume существующим функциям переменных.

  2. Сделайте атомарное упорядочивание тега параметра шаблона вместо переменной. Этот
    было бы огромным изменением, возможно, нам стоит сделать это отдельно, но это бы
    упростите это предложение, если бы оно у нас было.

  3. Устарел атрибут [[supports_dependency]] .

  4. C. Совместимость.

Автор рад добавить их в текущее предложение, если ИК1 сочтет, что
быть полезным для изучения.

6. Будущая работа

Текущее предложение содержит примерный API, очень грубую формулировку и небольшое количество
тесты. Над этими предметами нужно потрудиться. Кроме того, следующие
необходимо добавить операций:

Кажется, самый простой способ — попробовать API в
кодовая база C ++ с нуля. Очевидным кандидатом будет RCU пользовательского пространства.
реализация на C ++ с использованием этого API.

Также стоит подумать, следует ли ограничивать типы расходных материалов.
как-то. atomic требует тривиально копируемых типов, но не ограничивает
размер Т . Следует ли потреблять такое же ограничение? Это полезно для
потребляют очень большие значения? По опыту авторов, это не так, и Linux
ядро потребляет только указатели, но может быть полезно в других областях, а также
минимум того, что квалифицируется как «большой», зависит от ISA.

Сгенерированная сборка должна быть проверена на нескольких реализациях, чтобы
уверен, что различные компиляторы и ISA могут поддерживать предложенный дизайн.Уже
реализация образца была замечена, выливая зависимости в стек на
ARM64 с использованием GCC, который, как оказалось, действителен, но может быть хрупким.

7. Предлагаемый API

Ниже представлен предлагаемый API, доступны полная реализация и тесты.
на GitHub в разделе [StdConsume].

 зависимость класса;

// Значение и его зависимость.
// FIXME: должно ли это быть непрозрачным, чтобы позволить T неявно переносить зависимость?
template 
структурно зависимый {
    Значение T;
    Зависимость зависимость;

    зависимый () = удалить;
    зависимые (значение T, зависимость зависимости): значение (значение), зависимость (зависимость) {}
    зависимый (значение T): значение (значение), зависимость (значение) {}
};

// зависимый_ptr содержит указатель, который был получен в результате загрузки потребления
// операция.Он поддерживает ограниченный набор операций по сравнению с обычным
// указатели, которые позволяют ему продолжать переносить свою зависимость.
//
// зависимый_ptr отличается от зависимого  тем, что имеет один член данных, и
// действуя аналогично тому, как действуют обычные указатели. Зависимый_ptr - полезный
// абстракция, потому что она близко соответствует низкоуровневым деталям современного
// Зависимости, специфичные для ISA.
шаблон <имя типа T>
class зависимый_ptr {
общественность:
    // Конструкторы

    // Пока нет зависимости.зависимый_ptr () = по умолчанию;
    зависимый_птр (Т *); // FIXME: должно ли это также автоматически создавать зависимость?
    зависимый_птр (std :: nullptr_t);

    // С зависимостью.
    зависимый_ptr (T *, зависимость);
    зависимый_птр (std :: nullptr_t, зависимость);
    зависимый_птр (зависимый );
    зависимый_ptr (зависимый );

    // Конструкция копирования расширяет правую боковую цепочку, чтобы покрыть оба
    // зависимые указатели. Левая боковая цепь оборвана.
    зависимый_птр (константа зависимый_птр &);

    // Перемещение, копирование и кастинг

    // Назначение независимой правой части прерывает левую часть
    // цепь.зависимый_ptr & оператор = (T *);
    зависимый_ptr & оператор = (std :: nullptr_t);

    // Использование зависимого указателя как правой части присваивания
    // выражение расширяет цепочку, чтобы охватить как присваивание, так и значение
    // возвращается этим оператором присваивания.
    зависимый_птр & оператор = (константа зависимый_птр &);

    // Если значение указателя является частью цепочки зависимостей, то преобразовываем его в
    // intptr_t или uintptr_t расширяет цепочку до зависимости результата.Этот
    // может использоваться для тегирования указателя (с обычными оговорками C ++ для указателя
    // тегирование) с сохранением зависимостей.
    зависимый  to_uintptr_t () const;
    зависимый  to_intptr_t () const;

    // Смещения указателя

    // Индексирование через зависимый указатель расширяет цепочку до результирующего
    // ценить.
    зависимый  оператор [] (смещение size_t) const;

    // Операторы доступа к членам класса можно рассматривать как вычисление смещения. В
    // сам доступ находится в цепочке зависимостей, но такой доступ не распространяется
    // цепочка, покрывающая результат.Оператор T * -> () const;

    // Разыменовывание и адресация

    // Разыменование зависимого указателя расширяет цепочку до результирующего значения.
    зависимый  оператор * () const;

    // Если указатель является частью цепочки зависимостей, то применение унарного &
    // оператор адресации расширяет цепочку до результата.
    зависимый_ptr  оператор & () const;

    // В некоторых случаях, например, для указателей на функции, необработанный указатель
    // Требуется значение. Цепочка простирается до этого значения.T * value () const;

    // Чистая зависимость от зависимого_ptr.
    зависимость dependency () const;

    // Сравнения не нужны, потому что сами T * можно сравнивать
    // без разрыва цепочки зависимостей зависимого_ptr. Это
    // важно, потому что компиляторы могут оптимизировать определенные операции доступа на основе
    // результат сравнений, разрыв явно построенных цепочек в
    // процесс.

частный:
    // Только экспозиция:
    T * ptr {nullptr};
};

// Зависимость - это непрозрачное значение, которое можно связать через потребление
// операции.Цепочка зависимостей обеспечивает выполнение операций загрузки.
// зависимости друг от друга. Зависимости также можно комбинировать для создания
// новая зависимость, которая подразумевает зависимость от объединенных входов.
//
// [Примечание: зависимости создают ложные зависимости, как определено существующими ISA.
// - конечная нота]
class dependency {
общественность:
    шаблон  dependency (T);
    зависимость () = удалить;

    // Комбинация зависимостей.
    оператор зависимости | (зависимость d);
    template  оператор зависимости друга | (dependency ,hibited_ptr );
    template  дружественный оператор зависимости | (зависимый_ptr , зависимость);

    // Маркировка указателя.друг uintptr_t оператор | (зависимость, uintptr_t);
    друг uintptr_t оператор | (uintptr_t, зависимость);
    друг intptr_t оператор | (зависимость, intptr_t);
    друг intptr_t оператор | (intptr_t, зависимость);

    // Только экспозиция:
    typedef unsigned dependency_type;

частный:
    // Только экспозиция:
    dependency_type dep;
};

// Комбинация зависимостей свободной функции.
template  оператор зависимости | (dependency ,hibited_ptr );
шаблон  оператор зависимости | (зависимый_ptr , зависимость);

// Пометка указателя на свободную функцию зависимостью.оператор uintptr_t | (зависимость, uintptr_t);
оператор uintptr_t | (uintptr_t, зависимость);
оператор intptr_t | (зависимость, intptr_t);
оператор intptr_t | (intptr_t, зависимость);

// Начало цепочки зависимостей.
шаблон <имя типа T> зависимый_ptr  потребляемая_нагрузка (const std :: atomic  &);
шаблон <имя типа T> зависимый  потребляемая_нагрузка (const std :: atomic  &);

// Последующие зависимые операции.
шаблон <имя_типа T> зависимый_птр <Т> потребляемая_загрузка (зависимый_птр <Т *>);
шаблон <имя_типа T> зависимый  потребляемая_нагрузка (зависимый_ptr );
шаблон <имя_типа T> зависимый_ptr  потребляемая_нагрузка (T **, зависимость);
шаблон <имя типа T> зависимый  потребляемая_нагрузка (T *, зависимость);
 

8.Благодарности

Подгруппа ИК1 Комитета провела много продолжительных дискуссий о памяти
порядок потребления, и как это исправить. Чтобы прийти к этому, потребовалось много неудачных попыток.
решение. В частности, следующие люди оказали огромную помощь в
рецензируют эту статью: Ханс Бем, Оливье Жиру, Пол МакКенни, Робин Мориссет,
Тим Нортовер, Уилл Дикон. Филип Пизло внес значительный вклад в WebKit
реализация и использование потребителя, включая первый ценный вариант использования, который
Я считал прекрасным предлогом попробовать решение для потребителя, которое я имел в виду.

— Справочник по C ++

Заголовок

Регулярные выражения

Регулярные выражения — это стандартизированный способ выражения шаблонов для сопоставления последовательностей символов.

Стандартная библиотека C ++ обеспечивает поддержку регулярных выражений в заголовке посредством ряда операций. Все эти операции используют некоторые типичные параметры регулярных выражений:

  • Целевая последовательность (тема): Последовательность символов, в которых выполняется поиск шаблона.Обычно это диапазон, определяемый двумя итераторами, но некоторые функции также принимают взамен c-строку или строковый объект.
  • Регулярное выражение (шаблон): Шаблон, который ищется в целевой последовательности. Это должен быть объект типа basic_regex (например, regex), обычно созданный из строки со специальным синтаксисом, который описывает, что составляет соответствие (см. Синтаксис ECMAScript).
  • Массив совпадений: Некоторые операции позволяют получить информацию о совпадениях.Эта информация хранится в одном из специальных типов массивов match_results (например, cmatch или smatch).
  • Строка замены: Некоторые операции могут заменять совпадения. Эти замены указываются в строках, допускающих специальный формат (см. Синтаксис ECMAScript).

Операции с регулярными выражениями

Операции с регулярными выражениями выполняются с использованием функций или специальных адаптеров итераторов:

Функции:
regex_match
Последовательность совпадений (шаблон функции
)
regex_search
Последовательность поиска (шаблон функции
)
regex_replace
Заменить согласованную последовательность (шаблон функции
)

Типы итераторов:
regex_iterator
Итератор Regex (шаблон класса
)
regex_token_iterator
Итератор токена Regex (шаблон класса
)

Классы

Функции регулярных выражений и итераторы интенсивно используют набор поддерживающих типов в качестве аргументов и возвращаемых значений:

Базовые типы:
basic_regex
Регулярное выражение (шаблон класса
)
match_results
Результаты соответствия (шаблон класса
)
sub_match
Соответствие подвыражения (шаблон класса
)
regex_traits
Типажи Regex (шаблон класса
)
regex_error
Исключение регулярного выражения (класс
)

Некоторые из этих типов являются шаблонами и имеют псевдонимы для наиболее распространенных экземпляров:

экземпляров basic_regex:
регулярное выражение
регулярное выражение (класс
)
wregex
Регулярное выражение для wchar_t (class
)
экземпляров match_results:
cmatch
match_results для строковых литералов (класс
)
wcmatch
match_results для широких строковых литералов (класс
)
smatch
match_results для строковых объектов (класс
)
wsmatch
match_results для широких строковых объектов (класс
)
экземпляров sub_match:
csub_match
sub_match для строковых литералов (класс
)
wcsub_match
sub_match для широких строковых литералов (класс
)
ssub_match
sub_match для строк (класс
)
wssub_match
sub_match для широких строк (класс
)

Пространства имен

Этот заголовок также определяет пространство имен regex_constants, в котором расположены все значения констант, которые будут использоваться библиотекой:

regex_constants
regex constants (namespace
)

Грамматика

Регулярные выражения следуют очень строгой грамматике.По умолчанию функции в этой библиотеке используют грамматику ECMAScript:

Синтаксис ECMAScript
Синтаксис шаблона регулярных выражений ECMAScript (спецификации синтаксиса
)

Прочие функции

начало
Итератор в начало (шаблон функции
)
конец
Итератор до конца (шаблон функции
)

Выбор Java вместо C ++ для систем с низкой задержкой

Как разработчики, мы все знаем, что есть два способа делать что-то: ручной, медленный, раздражающий, сложный и автоматический, быстрый и даже более сложный.

Я мог бы, например, продолжить писать эту статью о том, почему вам следует использовать Java, а не C ++ для систем с низкой задержкой. Я мог бы начать тренировать ИИ, чтобы написать его за меня. Последний подход в конечном итоге сэкономил бы мне много времени на написание статей — он мог генерировать тысячи статей в секунду, — но мой редактор вряд ли обрадуется, узнав, что первая статья займет у меня два года.

Аналогичная ситуация наблюдается при разработке программных систем с малой задержкой.Принято считать, что было бы безумием использовать что-либо, кроме C ++, потому что все остальное имеет слишком большую задержку. Но я здесь, чтобы убедить вас в противоположном, противоречащем интуиции, почти еретическом представлении: когда дело доходит до достижения низкой задержки в программных системах, лучше использовать Java.

В этой статье я хочу взять конкретный пример программного обеспечения, для которого ценится низкая задержка; торговые системы. Однако приведенные здесь аргументы можно применить практически к любым обстоятельствам, в которых требуется или желательна низкая задержка.Просто это легче обсуждать применительно к той области разработки, в которой у меня есть опыт. И правда в том, что задержку сложно измерить.

Все сводится к вашему определению «низкой задержки». Разрешите объяснить…

Полученная мудрость

Давайте начнем с рассмотрения причин, по которым вам следует предпочесть C ++ для создания высокоскоростных систем с малой задержкой.

Поскольку C ++ гораздо ближе к металлу, большинство разработчиков скажут вам, что кодирование на этом языке дает преимущество в скорости.В ситуациях с малой задержкой, таких как высокоскоростная торговля, когда микросекунды могут иметь значение между жизнеспособной частью программного обеспечения и устаревшей тратой дискового пространства, C ++ считается золотым стандартом.

Или, по крайней мере, когда-то было. Реальность такова, что в настоящее время многие крупные банки и брокеры используют системы, написанные на Java. И я имею в виду написанные на Java, а не написанные на Java, а затем интерпретированные на C ++ с целью уменьшения задержки. Эти системы становятся стандартными даже для инвестиционных банков первого уровня, несмотря на то, что они (предположительно) медленнее.

Итак, что происходит?

Что ж, C ++ может иметь «низкую задержку», когда дело доходит до выполнения кода, но это определенно не низкая задержка, когда дело доходит до развертывания новых функций или даже поиска разработчиков, которые могут его написать.

(реальные) различия между Java и C ++

Однако вопрос времени разработки — это только начало, когда дело касается реальных различий между Java и C ++ в реальных системах. Итак, чтобы понять истинную ценность каждого языка в этом контексте, давайте немного разберем их.

Во-первых, важно помнить настоящую причину, по которой C ++ в большинстве ситуаций быстрее Java: указатель C ++ — это адрес переменной в памяти. Это означает, что программное обеспечение может напрямую обращаться к отдельным переменным, и ему не нужно просматривать таблицы, требующие больших вычислительных ресурсов, для их поиска. Или, по крайней мере, может, если будет указано, где они находятся, потому что с C ++ вам часто придется явно управлять временем жизни и владением объектами.

В результате, если вы действительно не очень хороши в написании (навык, на освоение которого могут потребоваться десятилетия), C ++ потребует часов (или недель) отладки.И, как вам скажет любой, кто пытался отладить механизм Монте-Карло или решатель PDE, попытка отладки доступа к памяти на фундаментальном уровне может занять очень много времени. Один только сломанный указатель может легко вывести из строя всю систему, поэтому выпуск новой версии, написанной на C ++, может быть поистине ужасающим.

Это, конечно, не все. Люди, которым нравится программировать на C ++ (все трое), укажут на то, что сборщик мусора (GC) в Java страдает от нелинейных всплесков задержки.Это особенно актуально при работе с устаревшими системами, поэтому отправка обновлений кода Java, не нарушая работу систем ваших клиентов, может сделать их настолько медленными, что их нельзя будет использовать.

В ответ я хотел бы отметить, что за последнее десятилетие была проделана большая работа по сокращению задержки, создаваемой Java GC. LMAX Disruptor, например, представляет собой торговую платформу с малой задержкой, написанную на Java, но также построенную как фреймворк, который имеет «механическую симпатию» к оборудованию, на котором он работает, и который не требует блокировки.

Проблемы могут быть дополнительно уменьшены, если вы создаете систему, которая использует процесс непрерывной интеграции и доставки (CI / CD), потому что CI / CD позволяет автоматическое развертывание проверенных изменений кода. Это связано с тем, что CI / CD обеспечивает итеративный подход к уменьшению задержек сборки мусора, при котором Java может быть постепенно улучшена и адаптирована к конкретным аппаратным средам без ресурсоемкого процесса подготовки кода для различных аппаратных спецификаций перед его отправкой.

Поскольку поддержка Java в среде IDE намного шире, чем в C ++, большинство сред (Eclipse, IntelliJ, IDEA) смогут рефакторинг Java. Это означает, что большинство IDE позволяют оптимизировать код для работы с малой задержкой, а эта возможность все еще ограничена при работе с C ++.

Даже если он не совсем соответствует C ++ по чистой производительности, большинству разработчиков будет гораздо легче достичь приемлемой производительности на Java, чем на C ++. Настоящий убийца задержки возникает между наличием идеи и отправкой кода для нее.

Что мы подразумеваем под «быстрее»?

На самом деле, есть веские основания сомневаться в том, что C ++ действительно «быстрее» или вообще имеет «меньшую задержку», чем Java. На данный момент я понимаю, что попадаю в довольно мутные воды, и что многие разработчики могут начать сомневаться в моем здравом уме. Но выслушайте меня.

Во-первых, есть (немного абсурдный) момент, что если у вас есть два разработчика, один пишет на C ++, а другой на Java, и вы просите их написать платформу для высокоскоростной торговли с нуля, разработчик Java будет торговать задолго до разработчика C ++.Для разработчиков, которые не использовали оба языка, вот почему: в Java гораздо меньше случаев неопределенного поведения, чем в C ++. Возьмем только один пример: индексация за пределами массива является ошибкой как в Java, так и в C ++. Если вы случайно сделаете это на C ++, у вас может возникнуть ошибка segfault или (что чаще) вы просто вернете какое-то случайное число, которое ничего не будет значить даже для опытных разработчиков. В Java индексирование за пределами границ всегда вызывает исключение ArrayIndexOutOfBoundsException . Это означает, что отладка в Java значительно упрощается, потому что ошибки, как правило, сразу вызывают ошибки, а местонахождение ошибки легче отследить.

Кроме того, по крайней мере, по моему опыту, Java (в большинстве сред) просто лучше распознает, какие фрагменты кода не нужно запускать, а какие критичны для работы вашего программного обеспечения. Вы, конечно, можете потратить дни на настройку своего кода C ++, чтобы он не содержал абсолютно никакого постороннего кода, но в реальном мире каждая часть программного обеспечения содержит некоторую раздутость, и Java лучше распознает его автоматически.

Это означает, что в реальном мире Java часто быстрее, чем C ++, даже по стандартным показателям задержки.И даже там, где это не так, разница в задержке между языками часто перекрывается другими факторами или даже близко не настолько велика, чтобы иметь значение, даже в высокочастотной торговле. Например, многое было сделано для уменьшения задержки в сетях 5G — до 1 мс, по мнению некоторых аналитиков, — но при программировании с низкой задержкой это все еще представляет собой значительную потерю производительности.

Преимущества Java для систем с низкой задержкой

Все эти факторы, на мой взгляд, создают довольно неопровержимый аргумент в пользу использования Java для написания высокоскоростных торговых платформ (и, действительно, систем с малой задержкой в ​​целом, подробнее об этом чуть позже).

Однако, чтобы немного повлиять на энтузиастов C ++, давайте рассмотрим ряд дополнительных причин для использования Java:

  • Во-первых, и, как мы уже видели выше, любая избыточная задержка, которую Java вносит в ваше программное обеспечение, вероятно, будет намного меньше, чем существующие приемники задержки, такие как задержки сетевой связи, в (по крайней мере) одной из систем, которые торгуют должны пройти до завершения. Это означает, что любой (хорошо написанный) код Java может легко работать так же, как C ++, в большинстве торговых ситуаций.
  • Более короткое время разработки Java также означает, что в реальном мире программное обеспечение, написанное на Java, может быть быстрее адаптировано к изменению оборудования (или даже к новым торговым стратегиям), чем C ++.
  • Если углубиться в это понимание, то вы увидите, что даже оптимизация программного обеспечения Java может быть быстрее — если рассматривать ее во всем программном обеспечении — чем аналогичная задача на C ++. Как недавно сказал InfoQ Питер Лоури, консультант по Java, заинтересованный в низкой задержке и высоком уровне всех систем, «если ваше приложение тратит 90% времени на 10% кода, Java делает оптимизацию на 10% сложнее, но написание и сопровождение 90%. % вашего кода проще; особенно для команд с разным уровнем подготовки.”

Другими словами, можно писать на Java, начиная с машинного уровня, для уменьшения задержки. Вам просто нужно написать его как C ++, имея в виду управление памятью на каждом этапе разработки.

Want to say something? Post a comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *