这看起来不太友好:
__asm("command 1"
"command 2"
"command 3");
Run Code Online (Sandbox Code Playgroud)
我是否真的必须在每一行都加上双引号?
另外......因为多行字符串文字在GCC中不起作用,所以我也不能作弊.
两个,也许是微不足道的问题:
真.我花了最后三天实现比std :: sort更快的东西,只是为了做到这一点.它应该是一个introsort,我怀疑它使用单个pivot版本quicksort里面.史诗失败.我的速度至少慢了两倍.
在我的痛苦中,我甚至复制粘贴其他 - 顶级 - 程序员代码.徒劳无功.我也对我的其他算法进行了基准测试...我的二进制搜索,以及upper_bound,lower_bound版本都被剥离了,实际上并没有用更少的指令.不过,它们的速度大约是其两倍.
我问,为什么,为什么,为什么?这引出了我的下一个问题......
当然,我想看看他们的消息来源!是否有可能编写比这些更有效的代码,或者我是否处于抽象级别与我的"简单"main.cpp,我无法达到STL库使用的优化?
我的意思是举例......让我们拿地图......这是简单的联想容器.文档说它是用红黑树实现的.现在......尝试实现我自己的红黑树是值得的,或者他们带着这种喜悦:-)远离我,我应该把我得到的所有数据都扔到地图容器中?
我希望这确实有意义.如果没有,请原谅我.
我知道一个简单的int向量具有O(1)随机访问时间,因为在给定所有元素具有相同大小的情况下,很容易计算第x个元素的位置.
现在最新的字符串向量?
由于字符串长度不同,它不能有O(1)随机访问时间,可以吗?如果可以的话,背后的逻辑是什么?
谢谢.
更新:
答案非常简洁明了,谢谢大家的帮助.我接受了乔伊的回答,因为它简单易懂.
假设我创建了一个包含char数组的类.现在,什么操作员处理这个:
myClass inst;
cout << inst;
Run Code Online (Sandbox Code Playgroud)
在"cout << inst;" 什么叫,只是通过班级的名字?谢谢.
我有一个结构链表.假设我将x百万个节点插入到链表中,然后我遍历所有节点以查找给定值.
奇怪的是(对我来说至少),如果我有这样的结构:
struct node
{
int a;
node *nxt;
};
Run Code Online (Sandbox Code Playgroud)
然后我可以通过列表迭代并检查比我在结构中有另一个成员的速度快十倍的值,如下所示:
struct node_complex
{
int a;
string b;
node_complex *nxt;
};
Run Code Online (Sandbox Code Playgroud)
我也用C样式字符串(char数组)尝试过,结果是一样的:因为我有另一个成员(字符串),整个迭代(+值检查)慢了10倍,即使我甚至没有触及那个会员!现在,我不知道结构的内部是如何工作的,但它看起来要付出很高的代价......
捕获量是多少?
编辑:我是初学者,这是我第一次使用指针,所以很可能,错误就在于我.我会尽快发布代码(现在不在家).
更新:我再次检查了数值,我知道看到的差异要小得多:2倍而不是10倍.这肯定是更合理的.
虽然昨天的情况肯定也是如此,我昨晚非常疲惫,我不能分两个数字,我刚做了更多的测试,结果令人心碎.
相同数量的节点的时间是:
看看结构中有两个以上的字符串会发生什么!它变快了!有人把LSD放进我的咖啡里吗?没有!我不喝咖啡.
对于我的大脑而言,这对我来说太过疯狂了,所以我想我会自己解决这个问题,而不是在SO处耗尽公共资源.
(广告:我认为我的剖析课没有错误,无论如何我能看到自己眼睛的时差).
无论如何,谢谢你的帮助.干杯.
我想表达我有3个相关的类型类.
我有两个文件.第一:
{-# LANGUAGE MultiParamTypeClasses, FunctionalDependencies #-}
module ModA where
class Class a b c | a -> b, b -> c where
getB :: a -> b
getC :: b -> c
Run Code Online (Sandbox Code Playgroud)
第二:
{-# LANGUAGE MultiParamTypeClasses, FunctionalDependencies #-}
module B where
import qualified ModA
data A = A {f1::String}
data B = B {f2::String}
data C = C {f3::String}
instance ModA.Class A B C where
getB a = B "hey"
getC a = C "ho"
getABForMe = ModA.getB (A …Run Code Online (Sandbox Code Playgroud) 我特别感兴趣的是窗户,mingw.
谢谢.
更新:首先,我认为每个人都熟悉字符串实习. http://en.wikipedia.org/wiki/String_interning
其次,我的问题很详细:我为练习敲了一个字符串课.没有什么花哨的你知道,我只是在课堂上存储大小和char*.
我使用memcpy进行分配.
当我这样做来测量std :: string和我的字符串类的赋值速度时:
string test1 = " 65 kb text ", test2;
for(int i=0; i<1000000; i++)
{
test2 = test1;
}
mystring test3 = "65 kb text", test4;
for (int i=0; i<1000000; i++)
{
test4 = test3
}
Run Code Online (Sandbox Code Playgroud)
std :: string是一个很大的赢家.我在赋值运算符(在我的类中)中没有做任何事情,但是用memcpy复制.我甚至没有使用"new"运算符创建一个新数组,因为我检查大小是否相等,并且只在需要时请求new.怎么会?
对于小字符串,没有问题.我看不出如何能的std :: string赋值比memcpy的速度更快,我敢打赌,它使用它太在后台,或类似的东西,所以这就是为什么我问实习.
Update2:通过单个字符赋值修改循环,如下所示:test2 [15] = 78,我避免了std :: string的copy-on-write效果.现在两个代码完全相同(好的,有1-2%的差异,但这可以忽略不计).因此,如果我没有完全弄错,mingw std :: string必须使用COW.
感谢大家的帮助.
我刚刚编译了这段代码:http: //www.win32developer.com/tutorial/winsock/winsock_tutorial_2.shtm
我添加了一些代码,因此它在无限循环中执行recv().我的问题,如果没有数据要读,它仍然没有阻止.
如果我认为recv应该阻止我的情况,我完全错了吗?
我添加的代码是:
for(;;)
{
char buffer[1000];
memset(buffer,0,999);
int inDataLength = recv(Socket,buffer,1000,0);
int nError=WSAGetLastError();
if(nError!=WSAEWOULDBLOCK&&nError!=0)
{
std::cout<<"Winsock error code: "<<nError<<"\r\n";
std::cout<<"Client disconnected!\r\n";
// Shutdown our socket
shutdown(Socket,SD_SEND);
// Close our socket entirely
closesocket(Socket);
break;
}
}
Run Code Online (Sandbox Code Playgroud)
它结束了,在线之后std::cout<<"Client connected!\r\n\r\n";.我知道我从一个"非阻塞"的例子中复制了这个,但我不认为这个代码应该做任何非阻塞的事情,但是,我的for循环运行得像疯了!