深入理解Effective C++:基础议题与操作符

需积分: 10 3 下载量 91 浏览量 更新于2024-07-29 收藏 925KB PDF 举报
"More_Effective_C++中文.pdf" 是一本关于提升C++编程效率和实践的书籍,由侯捷翻译,并提供了对C++编程规范、运算符、异常处理和效率优化等多个方面的深入指导。 该书首先介绍了C++的一些基础议题,如条款1指出,程序员应当清楚区分指针和引用,两者在内存管理、可空性以及对象生命周期上有显著差异。指针可以为空,而引用一旦初始化就不能改变引用的对象;条款2提倡使用C++风格的转型操作符,以提高代码的可读性和安全性,避免C风格的强制类型转换可能带来的问题;条款3强调避免以多态方式处理数组,因为这可能导致运行时的类型安全问题;条款4建议在不需要的情况下不要提供默认构造函数,以减少不必要的复杂性和潜在错误。 在运算符部分,书中讨论了如何明智地定义和使用运算符。例如,条款5提醒程序员在定义类型转换函数时要格外小心,以防止意外的类型转换和潜在的错误;条款6解释了自增和自减操作符前缀和后缀形式的区别,后缀形式会先返回原值再执行操作,而前缀则反之;条款7警告不应重载逻辑运算符"&&"、"||"或逗号运算符",",因为这些操作符有特殊的短路行为,重载可能导致预期之外的行为;条款8则探讨了正确理解和使用new和delete的重要性,避免内存泄露和对象生命周期管理的问题。 异常处理是C++中的重要概念,书中条款9至14对此进行了详尽阐述。条款9强调在析构函数中使用异常安全的编程策略来防止资源泄露;条款10提醒在构造函数中及时处理资源分配,以避免异常时的资源丢失;条款11告诫避免异常信息传递到析构函数外部,以保持异常安全;条款12讲解了抛出异常与传递参数或调用虚函数之间的差异,帮助理解异常传播的机制;条款13介绍了通过引用捕获异常,以避免异常信息的拷贝;条款14和15分别讨论了异常规格的使用和异常处理的性能影响。 效率是C++程序员关注的核心之一,书中条款16至24给出了很多实用的优化建议。条款16提出了著名的80-20法则,提醒程序员集中精力优化关键的20%代码;条款17介绍了延迟计算(惰性求值)的概念,用于提升性能;条款18讲解了如何分期偿还预期的计算开销;条款19揭示了临时对象的创建和销毁对性能的影响;条款20和21分别探讨了如何协助返回值优化和避免隐式类型转换;条款22和23建议考虑使用赋值运算符替代单独的运算符形式,并考虑修改程序库以提高效率;条款24详细讨论了虚拟函数、多继承、虚基类和运行时类型识别(RTTI)的性能成本。 最后,书中还涉及了一些编程技巧和模式(IDIOMS),如条款25的构造函数和非成员函数的虚拟化,以及条款26的限制类实例数量等,这些都是提高代码质量和可维护性的高级话题。 这本书旨在帮助C++开发者深入理解语言特性,遵循最佳实践,编写出更高效、更安全、更易于维护的代码。

优化代码 def cluster_format(self, start_time, end_time, save_on=True, data_clean=False, data_name=None): """ local format function is to format data from beihang. :param start_time: :param end_time: :return: """ # 户用簇级数据清洗 if data_clean: unused_index_col = [i for i in self.df.columns if 'Unnamed' in i] self.df.drop(columns=unused_index_col, inplace=True) self.df.drop_duplicates(inplace=True, ignore_index=True) self.df.reset_index(drop=True, inplace=True) dupli_header_lines = np.where(self.df['sendtime'] == 'sendtime')[0] self.df.drop(index=dupli_header_lines, inplace=True) self.df = self.df.apply(pd.to_numeric, errors='ignore') self.df['sendtime'] = pd.to_datetime(self.df['sendtime']) self.df.sort_values(by='sendtime', inplace=True, ignore_index=True) self.df.to_csv(data_name, index=False) # 调用基本格式化处理 self.df = super().format(start_time, end_time) module_number_register = np.unique(self.df['bat_module_num']) # if registered m_num is 0 and not changed, there is no module data if not np.any(module_number_register): logger.logger.warning("No module data!") sys.exit() if 'bat_module_voltage_00' in self.df.columns: volt_ref = 'bat_module_voltage_00' elif 'bat_module_voltage_01' in self.df.columns: volt_ref = 'bat_module_voltage_01' elif 'bat_module_voltage_02' in self.df.columns: volt_ref = 'bat_module_voltage_02' else: logger.logger.warning("No module data!") sys.exit() self.df.dropna(axis=0, subset=[volt_ref], inplace=True) self.df.reset_index(drop=True, inplace=True) self.headers = list(self.df.columns) # time duration of a cluster self.length = len(self.df) if self.length == 0: logger.logger.warning("After cluster data clean, no effective data!") raise ValueError("No effective data after cluster data clean.") self.cluster_stats(save_on) for m in range(self.mod_num): print(self.clusterid, self.mod_num) self.module_list.append(np.unique(self.df[f'bat_module_sn_{str(m).zfill(2)}'].dropna())[0])

2023-05-25 上传