当前位置: 首页 > news >正文

做网站最快多久凡科建站的建站后如何管理

做网站最快多久,凡科建站的建站后如何管理,宝塔面板wordpress安装,浙江省建设建材工会网站同程旅行C一面 公众号#xff1a;阿Q技术站 文章目录 同程旅行C一面1、sizeof与strlen的区别#xff1f;2、运算符和函数有什么区别#xff1f;3、new和malloc#xff1f;4、内存泄漏与规避方法#xff1f;5、悬空指针与野指针#xff1f;6、手撕冒泡排序#xff1f;7、…同程旅行C一面 公众号阿Q技术站 文章目录 同程旅行C一面1、sizeof与strlen的区别2、运算符和函数有什么区别3、new和malloc4、内存泄漏与规避方法5、悬空指针与野指针6、手撕冒泡排序7、说一下map8、C的现代特性 17和20新特性9、STL是否线程安全C11有什么保证线程安全的特性10、vector的底层原理和扩容机制扩容的性能损耗怎样尽可能的减少11、vector的end迭代器的指向迭代器的失效场景12、TCP的TIME_WAIT场景RST报文13、select和epoll的区别 1、sizeof与strlen的区别 sizeof是C/C中的操作符用于获取一个数据类型或变量所占用的字节数。它是在编译时计算的返回的是数据类型或变量的字节数而不是字符数。主要用于静态分配内存和获取数据类型的大小。 int arr[5]; size_t size sizeof(arr); // size 20 (5 * 4 字节)strlen是C/C中的函数用于获取一个以null终止字符数组C字符串的长度即字符数。它是在运行时计算的遍历字符数组直到遇到null终止符。主要用于计算C字符串的长度。 const char* str Hello, World!; size_t length strlen(str); // length 13需要注意的是sizeof通常用于获取数据类型的大小而strlen用于计算C字符串的长度。 2、运算符和函数有什么区别 运算符 运算符是C中用于执行各种操作的特殊符号或关键字。它们可以用于操作各种数据类型包括算术运算、逻辑运算、比较运算、位运算等。可以分为一元运算符作用在一个操作数上例如、--、二元运算符作用在两个操作数上例如、-以及三元运算符例如条件运算符? :。过载运算符C允许用户自定义类的运算符重载这允许你自定义如何处理类对象的运算。它是编译器内置的一部分它们具有特定的语法和预定义的行为这意味着它们通常更高效。 函数 函数是C中的自包含代码单元它们封装了一系列操作可以在需要的时候多次调用。函数的作用是执行特定的任务或操作可以接受参数输入并返回结果输出。函数的参数和返回类型可以是各种数据类型包括用户自定义类型。主要优势在于它们提供了代码重用的机制允许将代码划分为小的可管理单元。C中也有运算符重载的概念这允许用户自定义运算符的行为但与运算符重载不同它需要使用函数来实现。 区别 运算符是用于执行操作的特殊符号而函数是自包含代码单元用于执行一系列操作。运算符通常与基本数据类型一起使用而函数可以用于各种操作包括处理复杂的数据结构和对象。运算符具有内置的语法和行为而函数的行为需要在函数体内定义。运算符重载是C中的一个特性允许用户自定义运算符的行为而函数是C中的基本构建块之一用于组织和执行代码。 3、new和malloc new new 是C中的运算符而不是函数。它使用对象的构造函数来分配内存。 当使用 new 分配内存时它会执行以下操作 分配足够的内存以容纳对象或对象数组。调用对象的构造函数来初始化内存中的对象。返回指向已分配内存的指针。 new 不需要显式指定分配的内存大小因为它会自动计算对象或数组的大小。 malloc malloc 是C语言标准库函数也可以在C中使用。它不执行对象的构造函数。 当使用 malloc 分配内存时它会执行以下操作 分配指定大小的内存块。返回指向已分配内存的指针。 malloc 需要显式指定分配的内存大小通常使用 sizeof 运算符来计算对象或数组的大小。 区别 new 会调用对象的构造函数来初始化内存中的对象而 malloc 不会。这使得 new 更适合用于C类对象。new 不需要显式指定内存大小而 malloc 需要显式指定内存大小。new 是类型安全的因为它知道要分配的是什么类型的对象。malloc 不了解对象的类型。new 返回指向已分配内存的对象指针而 malloc 返回 void* 指针需要进行类型转换。 4、内存泄漏与规避方法 内存泄漏Memory Leak是指程序中己动态分配的堆内存由于某种原因程序未释放或无法释放造成系统内存的浪费导致程序运行速度减慢甚至系统崩溃等严重后果。 规避方法 C中的智能指针如std::shared_ptr和std::unique_ptr可以自动管理内存。它们会在不再需要时自动释放内存从而避免了手动释放内存的错误。创建对象时分配资源并在对象生命周期结束时自动释放资源。例如使用std::fstream来打开文件它将在退出作用域时自动关闭文件。使用标准库容器类如std::vector、std::map等它们在元素不再需要时会自动处理内存的释放。C11引入了std::shared_ptr和std::unique_ptr的容器如std::vectorstd::shared_ptrT以便更容易管理动态分配的对象。在使用智能指针时小心循环引用问题。循环引用可能导致内存泄漏。为了避免这种情况可以使用std::weak_ptr来打破引用环。如果你使用new分配内存则应该使用delete释放它如果使用new[]分配数组则应使用delete[]释放。在分配和释放内存时一定要保持一致。使用工具如ValgrindLinux/Unix、Dr. MemoryWindows、AddressSanitizerClang编译器、或MemorySanitizerClang编译器来检测内存泄漏。定期进行代码审查以寻找可能导致内存泄漏的问题。为了调试可以记录内存分配和释放的情况以便更容易识别内存泄漏。 5、悬空指针与野指针 悬空指针Dangling Pointer 定义悬空指针是指已经被释放的内存或对象的指针但仍然保留了指向该内存或对象的地址。产生原因悬空指针通常由于在指针指向的内存被释放后未将指针重置为nullptr或其他有效值。危害使用悬空指针可能导致读取无效内存修改已经释放的内存或调用已经销毁的对象的方法从而引发崩溃或未定义的行为。 野指针Wild Pointer 定义野指针是指未初始化或赋值的指针它包含一个未知的地址通常指向内存中的随机位置。产生原因野指针通常由于在创建指针后未初始化或在释放内存后未将指针置为nullptr。危害使用野指针可能导致程序访问随机内存引发崩溃或未定义的行为。 所以使用指针的时候需要注意以下几点 在创建指针后确保初始化它或者将其设置为nullptr。在释放内存后立即将指针置为nullptr以避免悬空指针。使用智能指针如std::shared_ptr和std::unique_ptr来管理资源从而避免手动释放内存减少悬空指针的风险。遵循良好的内存管理实践定期检查代码以查找并修复悬空指针和野指针问题。使用工具如ValgrindLinux/Unix、Dr. MemoryWindows、或编译器的内存检测工具来检测和修复指针问题。 6、手撕冒泡排序 思想 通过多次遍历待排序的元素比较相邻的两个元素如果它们的顺序不正确例如如果要升序排序当前元素比下一个元素大则交换它们的位置直到整个序列有序。 具体来说冒泡排序的过程如下 从数组的第一个元素开始比较它与下一个元素。如果当前元素大于下一个元素如果要升序排序则交换它们的位置。移动到下一个元素重复步骤1和2直到遍历整个数组一次。此时最大的元素已经被推到了数组的末尾。重复步骤1至3但忽略已经排序好的末尾元素继续对剩余的元素进行遍历和比较。重复以上步骤直到没有需要交换的元素整个数组已经排好序。 冒泡排序的主要特点是它多次遍历数组每次遍历都会将一个最大或最小根据排序顺序的元素冒泡到正确的位置因此称为冒泡排序。这个算法的时间复杂度为O(n^2)其中n是待排序元素的数量。尽管它不是最高效的排序算法但它非常简单容易理解适用于小型数据集或已接近排序状态的数据。 参考代码 #include iostream #include vectorvoid bubbleSort(std::vectorint arr) {int n arr.size();bool swapped;for (int i 0; i n - 1; i) {swapped false;for (int j 0; j n - i - 1; j) {if (arr[j] arr[j 1]) {// 交换arr[j]和arr[j1]int temp arr[j];arr[j] arr[j 1];arr[j 1] temp;swapped true;}}// 如果在一轮遍历中没有发生交换说明数组已经有序可以提前结束if (!swapped) {break;}} }int main() {std::vectorint arr {64, 34, 25, 12, 22, 11, 90};std::cout 原始数组: ;for (int num : arr) {std::cout num ;}bubbleSort(arr);std::cout \n排序后的数组: ;for (int num : arr) {std::cout num ;}return 0; }7、说一下map 在C中map内部实现了一个红黑树红黑树是非严格平衡二叉搜索树而AVL是严格平衡二叉搜索树红黑树具有自动排序的功能因此map内部的所有元素都是有序的红黑树的每一个节点都代表着map的一个元素。因此对于map进行的查找删除添加等一系列的操作都相当于是对红黑树进行的操作。map中的元素是按照二叉搜索树又名二叉查找树、二叉排序树特点就是左子树上所有节点的键值都小于根节点的键值右子树所有节点的键值都大于根节点的键值存储的使用中序遍历可将键值按照从小到大遍历出来。 优缺点 优点 有序性这是map结构最大的优点其元素的有序性在很多应用中都会简化很多的操作。红黑树内部实现一个红黑树使得map的很多操作在lgn的时间复杂度下就可以实现因此效率非常的高。 缺点 空间占用率高因为map内部实现了红黑树虽然提高了运行效率但是因为每一个节点都需要额外保存父节点、孩子节点和红/黑性质使得每一个节点都占用大量的空间。 使用示例 #include iostream #include mapint main() {std::mapstd::string, int wordCount;// 插入键-值对wordCount[apple] 5;wordCount[banana] 3;// 查找键的值std::cout Count of apple: wordCount[apple] std::endl;// 遍历mapfor (const auto pair : wordCount) {std::cout pair.first : pair.second std::endl;}return 0; }8、C的现代特性 17和20新特性 C17 新特性: 结构化绑定Structured Bindings 允许从复杂的数据结构中轻松提取元素例如元组、数组、结构体等。if constexpr 引入了if constexpr语法用于在编译时进行条件编译实现更灵活的模板元编程。折叠表达式Fold Expressions 允许将一系列操作如折叠、拼接等应用于参数包使模板编程更简洁。constexpr if 引入了constexpr if允许根据编译时条件来选择不同的代码分支提高编译时计算能力。变量模板Variable Templates 允许将模板应用于常量值实现通用的编程模式。新增标准库特性 C17引入了一些新的标准库组件如std::optional、std::any、std::variant等以增强标准库的功能。抛出表达式Expression Evaluation Order 规定了表达式的求值顺序以提高代码的可预测性。 C20 新特性: Concepts概念 引入了概念允许在模板编程中更好地控制参数类型提高模板代码的可读性。范围基于for循环Range-Based For Loops 支持基于范围的for循环的操作使代码更加简洁。协程Coroutines 引入了协程支持允许编写更高效、更易读的异步代码。三向比较Three-Way Comparison 改进了类型之间的比较操作以增加可读性和性能。模块Modules 引入了模块系统以替代传统的头文件包含提高代码组织和编译速度。标准库改进 C20带来了对标准库的多项增强如std::span、std::format、std::stop_token等。std::chrono和std::time 提供更精确的时间点和时间段表示以便处理时间和日期。其他改进 C20还包括对语法、性能和代码可读性的多项改进如结构化绑定的增强、范围算法的增加等。 这里给大家贴一个优秀的博客自己可以去看看https://blog.csdn.net/qq_41854911/article/details/119657617 9、STL是否线程安全C11有什么保证线程安全的特性 STL标准模板库在C中不是线程安全的。STL容器和算法通常不提供内置的线程安全机制因此在多线程环境中使用STL容器和算法时需要采取额外的措施来确保线程安全。 C11引入了互斥量mutex以及其包装类std::lock_guard它们可以用来在多线程环境中同步对共享数据的访问。通过在对STL容器和算法的访问前后使用互斥量可以实现线程安全。C11引入了std::atomic模板用于实现原子操作以确保多线程环境下对共享变量的安全操作。它包括一系列原子类型如std::atomic、std::atomic等。C11引入了std::condition_variable它允许线程在等待特定条件成立时阻塞直到其他线程满足条件并通知它。std::future 和 std::promise 这些C11特性用于实现异步编程可以在多线程环境中方便地返回和获取异步操作的结果。 10、vector的底层原理和扩容机制扩容的性能损耗怎样尽可能的减少 底层原理std::vector 的底层数据结构是一个连续的动态数组元素在内存中排列成一系列的单元。这使得通过索引来访问元素非常高效因为它可以通过内存指针和偏移量直接计算出元素的地址。 扩容机制当std::vector的元素数量接近当前内存块的容量由capacity()函数获取它需要进行扩容以分配更多的内存。通常std::vector会将容量翻倍以确保均摊时间复杂度仍然是常数时间。扩容时会发生以下步骤 分配新的内存块通常是当前容量的两倍。将现有元素复制到新的内存块中。释放旧的内存块。更新begin()和end()迭代器以指向新的内存块。 扩容操作是std::vector的一个性能瓶颈因为它需要分配新内存并复制现有元素。这可能会导致分配内存和数据复制的开销。为了减少扩容时的性能损耗可以考虑以下方法 预分配足够大的容量 如果您事先知道std::vector将包含大量元素可以使用reserve()函数来预先分配足够的内存。这将减少扩容的频率。避免频繁的插入和删除 如果需要频繁插入和删除元素而且元素数量变化较大std::vector可能不是最佳选择。考虑使用std::list或std::deque等数据结构它们更适合频繁的插入和删除操作。使用移动语义 如果您需要将元素从一个std::vector移动到另一个使用移动语义而不是复制元素以降低性能开销。C11引入的std::move可以帮助实现这一点。自定义内存分配策略 如果性能至关重要您还可以考虑自定义内存分配策略以更精细地控制内存管理但这通常比较复杂。 11、vector的end迭代器的指向迭代器的失效场景 std::vector 的 end() 迭代器指向容器的最后一个元素的下一个位置。具体来说end() 迭代器指向一个虚拟的元素这个元素位于容器的末尾它并不包含任何有效的数据因此不能用于访问数据。 一些迭代器的失效场景 当向 std::vector 中添加或删除元素时特别是在中间位置插入或删除元素可能会导致迭代器失效。这是因为扩容或移动元素可能会改变它们的物理位置。当 std::vector 容量不足需要扩容时之前的迭代器会失效因为新的内存块被分配并且元素被移动。当使用 clear() 函数清空容器时所有迭代器都会失效。如果删除 std::vector 中的元素并且之后尝试使用指向已删除元素的迭代器会导致未定义行为。如果容器本身被销毁那么任何与该容器相关的迭代器都会失效。 12、TCP的TIME_WAIT场景RST报文 TIME_WAIT是TCP连接的一个状态它发生在连接被主动关闭即主动关闭的一方先发送FIN后用于确保连接的完整终止和释放。 主要目的 TIME_WAIT状态允许另一端可能还有未被接收的数据发送以确保它们被接收。防止新建立的连接意外地接收到之前连接的残留数据这可能会导致数据混淆或不完整。当TIME_WAIT状态结束后操作系统可以释放与该连接相关的资源例如端口号等。 TIME_WAIT状态的持续时间通常是2倍的最大报文段寿命2MSLMaximum Segment Lifetime它通常为1到2分钟。这样可以确保旧连接的数据完全被清理不会影响后续连接。 RST报文是TCP中的一种控制报文用于立即终止一个连接。 主要用途 当TCP连接出现错误时可以使用RST报文来立即终止连接而不进行正常的四次握手关闭。服务器可以使用RST报文来拒绝某个连接请求通常因为无法处理请求或者由于安全原因。在某些情况下RST报文可以用于快速终止连接而不等待正常的连接终止过程。 TIME_WAIT状态和RST报文都与TCP连接的终止过程有关但它们具有不同的目的和用途。在终止连接时 TIME_WAIT状态用于确保旧连接的数据不会与新连接混淆同时等待任何可能未被接收的数据。RST报文用于立即终止连接通常用于错误处理或快速终止连接的情况。 13、select和epoll的区别 select 和 epoll 都是用于多路复用 I/O 操作的机制它们允许一个单独的进程或线程管理多个文件描述符sockets、文件等的读写操作。 select 跨平台几乎在所有主要操作系统上都可用包括Linux和Windows系统。在处理大量文件描述符时效率较低因为它使用线性扫描来查找可读或可写的文件描述符这意味着它的时间复杂度为 O(n)其中 n 是文件描述符的数量。通常限制了文件描述符的数量因此在处理大量并发连接时可能会遇到限制。不会告诉你文件描述符的状态发生了什么改变它只会告诉你哪些文件描述符当前可读或可写。这可能需要额外的逻辑来追踪状态改变。可以指定超时时间允许在一段时间内等待事件然后进行处理。 epoll epoll 是Linux特有的多路复用机制不适用于所有操作系统。使用了回调机制只有就绪的文件描述符才会触发回调因此它在处理大量文件描述符时效率更高时间复杂度为 O(1)。没有文件描述符数量的硬限制允许管理大量的并发连接。提供了更详细的事件通知包括文件描述符的连接建立、数据可读、数据可写等而不仅仅是文件描述符的可读或可写。适用于高性能服务器它能够轻松处理大量的并发连接。 其余项目及实习经历不在这儿赘述。 来源https://www.nowcoder.com/feed/main/detail/efb0a2d156e84784b541ff713b7cbe1c
http://www.hkea.cn/news/14487926/

相关文章:

  • 现在建站好么上海建设部网站
  • 网站建设客户会问的问题做景观设计比赛的网站
  • 扬州建设工程信息网站网站打不开怎么处理
  • 北京做网站便宜的公司哪家好建设网站管理规定
  • 客户都不愿意做网站学校网站模板wordpress
  • 网站备案必须做前置审批吗畅言wordpress插件
  • 九江市建设工程门户网站你好多莉 wordpress
  • 哪个网站是用php写的网站模板
  • 网站视频下载方法上海建筑业网证书查询
  • 上海做宴会的网站重庆建设工程安全信息网查询
  • 广州seo优化推广信息流广告优化师
  • 筹划电子商务网站建设网站开发按几年摊销
  • 体验营销策划方案seo培训优化
  • ip网站查询服务器重庆网站开发培训机构
  • icp备案查看网站内容吗wordpress可以做相册吗
  • 九九建站-网站建设 网站推广 seo优化 seo培训漫画网站开发源码
  • 加强网站建设工作自媒体网络营销是什么
  • 建立网站有哪些步骤wordpress 后台添加文章 没编辑功能
  • 虚拟主机怎么弄网站新品网络推广
  • 百度云网站建设教程视频教程手机做wordpress
  • 北京网站备案号查询网上家教网站开发
  • 浙江杰立建设集团网站网站开发应该注意什么
  • 广东建设继续教育网站泰安网站建设制作电话号码
  • 评价一个网站的优缺点html静态网站下载
  • 蛋糕网站案例微信运营管理软件
  • 手机端网站建设教程wordpress 目录 伪静态
  • 个人网站建设案例课堂百度做网站骗人到哪里去投诉
  • 免费网站模板素材微信朋友圈营销方案
  • 杭州北京网站建设公司哪家好ui网页设计师
  • 电子商务网站建设代码百度如何精准搜索