V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX  ›  yanqiyu  ›  全部回复第 5 页 / 共 33 页
回复总数  652
1  2  3  4  5  6  7  8  9  10 ... 33  
@yanqiyu 洗了个澡发现边界情况写错了,修了(狗头)
#include <stdbool.h>
#include <stdio.h>
#include <string.h>

void print_word(const char *str, size_t start, size_t stop) {
for (size_t i = start; i <= stop; i++) {
// there is sth like %.*s but for simplicity ...
printf("%c", str[i]);
}
}

int main(int argc, char **argv) {
char test_str[] = " f test sentence here bla bla ";
size_t len = strlen(test_str) - 1;
size_t start = len;
size_t stop = len;
// flag just for proper trailing space ...
bool is_first_wold = true;
for (int i = len; i >= 0; i--) {
if (i != 0 && test_str[i] == ' ' && (test_str[i - 1] != ' ')) {
stop = i - 1;
} else if (test_str[i] != ' ' && (i == 0 || test_str[i - 1] == ' ')) {
start = i;
if (is_first_wold) {
is_first_wold = false;
} else {
printf(" ");
}
print_word(test_str, start, stop);
}
}
return 0;
}
224 天前
回复了 zzzkkk 创建的主题 C++ fsantinize 弱智
@zzzkkk 写这么多 while 属于看着就血压高了,寻找单词就看寻找边界就行,一个 while/for 反向找单词边界然后输出就够了
倒序扣单词并不困难啊,维护两个 index ,一个头部一个尾部,寻找空格和非空格的边界就完了,哪用得着这么多 while

这么写结构清晰很多,并且含义还容易理解

#include <stdbool.h>
#include <stdio.h>
#include <string.h>

void print_word(const char *str, size_t start, size_t stop) {
for (size_t i = start; i < stop; i++) {
// there is sth like %.*s but for simplicity ...
printf("%c", str[i]);
}
}

int main(int argc, char **argv) {
char test_str[] = " f test sentence here bla bla ";
size_t len = strlen(test_str) - 1;
size_t start = len;
size_t stop = len;
// flag just for proper trailing space ...
bool is_first_word = true;
for (size_t i = len; i > 0; i--) {
if (test_str[i] == ' ' && test_str[i - 1] != ' ') {
stop = i;
} else if (test_str[i] != ' ' && test_str[i - 1] == ' ') {
start = i;
if (is_first_word) {
is_first_word = false;
} else {
printf(" ");
}
print_word(test_str, start, stop);
}
}
return 0;
}
盲猜是你链接的库里面的全局/静态对象初始化的时间
可以借助 gprof 这样的 profile 工具采样调查耗时
或者-finstrument-functions 配合手写__cyg_profile_func_enter 以及__cyg_profile_func_exit 直接看每个函数的耗时(不知道有没有造好的轮子)
239 天前
回复了 bitllion 创建的主题 Linux Linux 虚拟机防火墙如何实现
这种情况下网络请求是从桥上走的,估计得开 bridge-nf-call-iptables 才能让这些请求被过滤
但是要注意这么开可能有别的副作用
原来的代码: return xx;/return !xx;

现在的代码:
起手一个 boolReturnValueWarpI 的接口类,衍生出 boolReturnValuePassthrough boolReturnValueInvert boolReturnValueAlwaysFalse boolReturnValueAlwaysTrue boolReturnValueRandomly 几个类,大家一起重载虚方法 bool operator()(bool),然后在设计工厂类 boolReturnValueWarpF 构造对应的对象,为了这个事情再引入一个动态的配置数据库 gConfiguration
最后
return boolReturnValueWarpF::Instance().GetObject(gConfiguration.GetBoolWarpConf())(xx);
又唬人有专业,别人有意见还能说你看我这多灵活,还支持运行时选择怎么处理 xx
那我必然表演什么叫做过度设计
240 天前
回复了 JarvenI 创建的主题 Linux 请问 pve7.4 如何修复根分区?
最后两行只是告诉你在重放日志,没有说报错。卡在这里别有原因,我建议开高 loglevel 等级看看
245 天前
回复了 8675bc86 创建的主题 Linux 跨发行版升级
都很 FHS compliant ,你要是操作骚+技术好应该能做到
其实我一直用的土办法:
先 systemd-run 把东西跑起来,然后修改产生的 transient unit file 作为 unit file
258 天前
回复了 stephen2009 创建的主题 Linux docker overlay 占用磁盘大
@bohai drop_caches 丢掉的是页面缓存,在内存里面
真正可能成为陷阱的是一些被进程打开的文件,拿着引用计数导致磁盘上文件不能真正的删除,但这显然不是 po 遇到的问题,这类情况是删除了文件但 df 没变的时候
---
po 遇到的问题的一个可能性是 docker 的数据是层叠的 overlayfs ,这东西要是容器写入了 base 里面的文件可能触发什么奇怪的全文件的 COW 导致占用翻倍(最极端的情况修改一个文件的几个 kb 的段,或者改一下文件的权限就可能导致整个文件被复制)
docker container diff container_name 可以看看是不是有这类情况
另外建议就是经常被修改的路径(状态,配置)放到 volume 里面,不要 commit 进容器,不要让容器在运行时修改容器本身
(所以我爱用 btrfs 做存储后端)
278 天前
回复了 yjcn 创建的主题 Linux btrfs corrupt 数量持续增长 原因是啥呢?
dmesg 里面可能有具体出问题的文件路径
以及可以跑一遍 scrub 看看具体怎样
fedora silverblue
/var 就是数据
282 天前
回复了 raw0xff 创建的主题 Linux Linux 服务器中如何安全的存储私钥文件?
HSM ,管理员物理带在身上,需要签名的时候插上去
284 天前
回复了 alanying 创建的主题 Linux 大家 Linux 新安装一般是怎么分区的?
/efi /boot / (btrfs 的 子卷做 home)

单独的 /boot 的原因是 grub 对于 btrfs 没写入支持,有时候会有问题
@xiaoluobo58 并不会简单...大概,要构建一个可用的系统你至少得写一套 shell+libc+编译器+init
作为玩具规模太大,作为项目重复造轮子严重
@wxf666 这也是为什么有的语言的分配器倾向于直接要一个 T 再自己分配,好处就是不用频繁的用 syscall 找 os 要地址,一口气要个大的。
@wxf666 是的,你可以试一下下面的代码,一口气分配 100T ,但是 RES/SHR 依然很小
当然再大就超出了地址空间了
```
#include <cerrno>
#include <iostream>
#include <sys/mman.h>

int main(int, char **) {
constexpr auto size = (size_t)100 << 40;
auto address = mmap64(nullptr, size, PROT_READ | PROT_WRITE,
MAP_PRIVATE | MAP_ANONYMOUS | MAP_NORESERVE, -1, 0);
if (address == MAP_FAILED) {
std::cerr << "mmap failed \n errno:" << errno << std::endl;
return 1;
}
std::cout << "mmap success, press enter to exit" << std::endl;
std::getchar();
munmap(address, size);
return 0;
}
```
@wxf666 没分配也不会写页表,只是记录下来某段地址成为“可用状态”(代价微乎其微),真正遇到缺页中断才会真正的分配页表
虚拟内存就是纯粹的数字。有些分配器倾向于一启动就 mmap 出来一块超大内存再慢慢分配,所以看起来就是 1T/2T 的 VIRT
但是不真正的读写这些内存,内核是不会真正分配页面的
1  2  3  4  5  6  7  8  9  10 ... 33  
关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   5165 人在线   最高记录 6543   ·     Select Language
创意工作者们的社区
World is powered by solitude
VERSION: 3.9.8.5 · 34ms · UTC 01:22 · PVG 09:22 · LAX 18:22 · JFK 21:22
Developed with CodeLauncher
♥ Do have faith in what you're doing.