V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX  ›  ipwx  ›  全部回复第 64 页 / 共 200 页
回复总数  3991
1 ... 60  61  62  63  64  65  66  67  68  69 ... 200  
@levelworm

1. 想好所有架构开始写,这才是对的。不然你项目规模根本不可能突破一万行。
2. 裸指针一把梭?泄露就泄露?朋友,习惯了这种写法,你项目永远做不大啊。
2021-07-16 11:40:27 +08:00
回复了 aqtata 创建的主题 程序员 你们都有自己的 utils 吗?
写到的时候去自己 GitHub,从项目里面找。我自己成型的项目还不少。
@wutiantong 有些人在编程语言上特别执拗,有种宗教狂热的感觉。比如王垠,不是瞧不起非 FP 语言么。安啦安啦
@junkun const char* 可以隐式转换为 bool 这个还真让我踩过。不过一个函数会同时在同样的位置接受这两个类型的参数还真挺少见。
@ysc3839 @levelworm 另外我觉得 shared_ptr 最合适的场景其实是只读对象或者数据对象。一个对象被创建出来,记录了一些信息,发给多个持有者,这些持有者的生命周期都不一样,并且在错综复杂的多线程环境中。这种时候用 shared_ptr 就很合适。

比如进程里面通过消息队列来传递消息的这种场景。
@levelworm 在任何你想用 new T 并且只有一个人拥有它的地方都能用 unique_ptr 。

至于 shared_ptr,主要是不特定多个持有者要共享同一个对象才会用,这些持有者到底谁先死都不知道的时候还是有必要的。在多线程并发程序里面有时候还是躲不过的,比如 boost::asio
@GeruzoniAnsasu 是的是的。因为过于熟悉这套我甚至忘了这才是 c++ 最值得称赞的东西,只记得用起来很好用。

不过楼上几个老哥说起的 Rust 不知道有没有这个特性,看上去好像也有点意思。
@Austaras 哦我知道了。我项目用了个类似 NumPy 的 C++ tensor template library 。

https://github.com/xtensor-stack/xtensor

这个 Rust 估计不太行。别的不说,这个库超级依赖 C++ template metaprogramming,在接口一致的情况下可以分情况自动使用 simd 。
@Austaras ummm 我又不熟 Rust,我怎么和你讨论这个问题。

反正前段时间我找 lock-free non-blocking mpmc queue 的时候,github 资料很多,论文也是用 C++ 写的。Rust…… 它太新了啊,这种偏门玩意儿万一找不到怎么办呢?对吧。
@YUCOAT 老哥,C++ coroutines 是个半成品啊,面向库作者的。就好像只教了你极限的概念,却不教你怎么用微积分,这看得懂才怪。我又不想 contribute to boost,那我选择等一等。
@ericgui 其实 shared_ptr 很好用,相信我。
2021-07-15 13:04:38 +08:00
回复了 mer 创建的主题 C++ C++ 中 Lambda 对变量的捕获居然是在声明时就做了
楼主可能和 JS 搞起来了。但是 JS 那种其实不是更奇怪吗。

for (int i=0; i<10; ++i) {
task_list.emplace([i] () { std::cout << i << std::endl; });
}

这种用法不挺符合常识吗?
@dqzcwxb 呃我查了一下,zgc 最大停顿是 10ms 啊,不太行。我这边要求每个请求都非常稳定低延迟,这不是概率问题,是全部都要。
@dqzcwxb 啊看错了一个单位。0.05ms 确实挺厉害,不过我这边也没有 jvm 大神不懂这些
@Austaras ummm 生态问题吧。至少 conan.io 上 c++库随便搜。还有就是我挺熟 c++
@dqzcwxb 太慢。我的需求是每个事务稳定的低延迟,到 1ms 以及以下量级。有些地方我日后可能还得考虑做无锁,因为内核调用 20us,不太能接受。
@dynastysea 还有,一开始就考虑 C++ 是因为 Java/C# 这些带 GC 的语言有 GC 延迟。而我这里需要非常确定性的低延迟执行时间,又是各种多线程的,所以只能配合 shared_ptr 用 C++ 了。
@dynastysea 主是写起来就需要。
----

我上半年写了个 3.5 万行的 C++ 项目,需要低延迟高性能。如果没用 C++17 估计得 5 万行了。

最常用的新特性:

1 、for (const auto& : ...)
2 、T&&,这能让我明确指定一些情况下不需要拷贝而是移动栈对象。(对高性能程序很重要)
3 、template <typename Args...>。我用了很多这个来简化写代码。
4 、template <typename Fn> void someWrapper(const Fn& fn)。这就是所谓的高阶函数,特别简化代码。
常见用法比如 void wrapError(const Fn& fn)
还有就是需要对不同 fn 的进行相似的初始化、返回值进行相似的操作。
5 、template <bool XXX> void f(...) { if constexpr (XXX) { } }。这个特别好用。因为有些分支在有些情况下是不运行的,你想要减少 latency,就用 constexpr 去直接暴力优化掉这些代码。( constexpr 是编译期判断)
6 、std::unique_ptr, std::shared_ptr 。这不是新特性了。但是配合 T&& 和 std::move 就很好用。

上面这些都挺省我代码量的。一些其他零碎可能我用到的不够多就不记得了。
2021-07-15 11:18:49 +08:00
回复了 woshipanghu 创建的主题 SQL Server 做外贸系统遇到订单日期的问题, sql 不知道该怎么写
时间戳就是 1970-01-01 00:00:00 UTC+0 之后开始的秒数。

那是个历史时刻,时间点是确定的,和时区无关。楼主你再想想。
----

存 timestamp 然后找库按照 timezone 格式化出来就行。
@dynastysea 其实那些特性都还挺重要(还嫌不够)。
1 ... 60  61  62  63  64  65  66  67  68  69 ... 200  
关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1400 人在线   最高记录 6679   ·     Select Language
创意工作者们的社区
World is powered by solitude
VERSION: 3.9.8.5 · 44ms · UTC 16:27 · PVG 00:27 · LAX 09:27 · JFK 12:27
Developed with CodeLauncher
♥ Do have faith in what you're doing.