关于作者

用户名:johnnycui
笔名:晓崔
地区: 北京-北京
行业:其他

日历  

快速登录

+ 用户名:
+ 密 码:

在线留言



BLinker

嫌弃砸吧

我的老本行

搜索引擎

Google Adsense

Google Search

Google
Web 晓崔忆网

访问统计:
文章个数:258
评论个数:255
留言条数:9




Powered by BlogDriver 2.1

晓崔忆网 情深思阔

 

我的人生,在人间。记忆我爱的人和爱我的人,给大浪中的一叶孤舟留下一丝水纹的印迹......
欢迎联系,来者不拒

文章

欢迎大家光临我的MSN Space

在那里我会与你一同分享我的科研生活和人生历程

网址:http://spaces.msn.com/members/blogcui/

See U everywhere

- 作者: 晓崔 2005年06月1日, 星期三 17:39  回复(0) |  引用(0) 加入博采

在STL中认识new function

new这个东西我想已经被人们讨论的不要再讨论了。但是最近的一些发现还是让我对它有了新的认识。前一段时间利用STL开发,发现project会出现有规律的crush,但是在VS.Net中却没有任何的crush信息弹出对话框,而是出现了“This application request the RUNTIME to terminate it...”我看了十分不解,可能是我太依赖VC6的原因。经过漫长的跟踪,后来才发现。这是new在std环境下的另一种内存分配失败的表现形式:throw error

正如大家所知,在非std环境下new对于内存分配失败,会返回NULL作为返回值;这就要求我们在std里对于new的操作有新的检查方式:

// new_and_delete.cpp
// compile with: /EHsc
#include <stdio.h>
#include <new>
#include <limits.h>
int main()
{
   int * i_arr;

//******************
   try {
      i_arr = new int[0x3fffffff];
   }
   catch(...) {
      printf("caught exception\n");
   }

//******************

   int * k_arr;
   k_arr = new (std::nothrow) int[0x3fffffff];

   delete[] i_arr;   // vector delete
   delete[] k_arr;
}

而如果你想在std中不希望抛出异常,就要在使用时加上(std::nothrow)即可。

class is over!!

- 作者: 晓崔 2005年05月11日, 星期三 11:15  回复(0) |  引用(0) 加入博采

我又回来了

正如很多网友说得那样,很久没有来这里呵护我的blog了,是生活的选择,让我一时没有时间。现在在MSRA实习,好像生活的节奏和方式,也和以前大不一样了,甚至让我没有心情来在网上走走看看,网络上的我也基本上成了两点一线,除了收邮件和查阅资料在无其它。好在我看到了blog现在清新的界面让我有燃起了冲动。

我终于又回来了,但是说实话。我喜欢现在的研究(自然语言处理和IR,如果有志同道合的朋友可以i联系我啊),因为他让我感到了自己身上的一种使命感,让我抱着一种期望:改变人类未来的交流方式,使人机交互成为可能。

- 作者: johnnycui 2005年05月11日, 星期三 10:39  回复(0) |  引用(0) 加入博采

如何在VC6中编写DLL时尽可能向用户减少头文件的输出(保密用)

在编写SDK时,我们都要用到DLL的模式给用户提供服务,或者提供可使用的函数,或者提供输出类。当更能比较大的情况下,我们习惯把它们已一个类的形式展现给用户,配以漂亮的说明文档(Perfect)。这就需要用到MFC Extension DLL(using shared MFC DLL)工程模版。

在要输出的类定义前面加上AFX_EXT_CLASS宏定义。那么我们就进入正题。

如果你想输出的类,要需要调用其它类。最简单的实现方法就是把所有类的头文件都提供给用户,让他们在使用的时候按需要Include进去就好了。但是这样存在一些问题:

1、大量的头文件,会使得用户对SDK的使用感觉十分不方便,也容易弄混乱;

2、向用户透露了过多的商业机密,这样对公司不太好吧.....(反正我现在也不是老板)

那么如何避免这些问题呢?.........


解决方法一:(不完全保密)

在SDK里的你希望输出的类中做如下改动:

1、把对其它类的头文件的引用写在输出类的cpp中,在输出类的头文件里用class xxxxx来声明这些所用到的类;

2、这样要求在使用这些类作为输出类的成员变量时,只能以指针的形式引用,而不能用对象的形式。

大家可以看出来,这样的结果。虽然用户看不到其它类头文件的信息,但是也看到了用到哪些类。

解决方法二:(完全保密)

在SDK里的你希望输出的类中做如下改动:

1、把对其它类的头文件的引用写在输出类的cpp中,在输出类的头文件里不显示任何其它信息;

2、在输出类里,用到的其它类的成员变量一概用LPVOID声明;

3、在输出类的Cpp里的构造函数里,把所有实际用到的类强制转换成像对应的LPVOID的输出类的成员变量

如: CProtect * pPro = new CProtect;   //CProtect是不想透露的类
       m_pPro = (LPVOID) pPro;            //强制转换成输出类的成员变量

4、在输出类里,用到对应的类的函数时在把输出类LPVOID成员保存的地址,付给所用的类,调用其函数

如: CProtect *pro = (CProtect *)m_pPro;

       pro->DoSomething();

5、当然不要忘记在输出类的析构函数里释放

如: CProtect* cpro = (CProtect *) m_pPro;
      delete cpro;

这样哈哈,用户看到的就只是一堆LPVOID指针指向的对象了。就这样,如果说的不够明白的话,看看附件[Dlltest.rar]
http://blog.blogchina.com/upload/2005-03-23/20050323163346853432.rar好了


 

- 作者: johnnycui 2005年03月23日, 星期三 16:35  回复(5) |  引用(0) 加入博采

google又出新Logo了

2005/03/22今天是节水日么?

想到一个事儿,无论是作为开发者,还是新经济环境下的新型思维者,饮水思源都很重要。



- 作者: johnnycui 2005年03月22日, 星期二 16:53  回复(0) |  引用(0) 加入博采

有关半月板受伤的恢复
zgq,网友你好,看到你的回复.其实很专业方法我也不是专家.只不过是久病成医,最近也找了很多学医的同学做了咨询.大家都认为,如果不是专业运动员, 最好采用保守治疗的方法,也就是说慢慢恢复.我认识的一个同学的外公,今天80左右了,身体倍儿棒.年轻时半月板也不好,还有"交锁"的现象,不过老人说 这种情况,不是由病理造成的(比如风湿),而是损伤所致,是可以恢复的而且随着年纪的增大会变好,这位老人家现在每天早上坚持做50蹲起,我做了一起都受 不了阿.佩服.

说说我的近况,我的膝盖感觉好多了.现在每周打一次乒乓球.基本上没有异常的感觉了.所以只要有耐心我想恢复是没有问题的.


- 作者: johnnycui 2005年03月21日, 星期一 23:02  回复(10) |  引用(0) 加入博采

陈天桥在参访中的一句话
昨天晚上无意中看了cctv的《对话》栏目,嘉宾正式盛大网络的陈天桥。在节目里他说了一句话让我感受颇深:"世上没有做错了的事情,之所以做错了是因为 时间不对而已,因此对人生节奏的把握是成就理想的根本"。反思陈天桥的发迹史,仅仅5年时间公司可以到目前的大好形势,除了人们都在说的"运气"之外,对 于机遇的把握和掌控全局的能力至关重要。陈提到创业开始的失败原因是因为--不专。在调整了公司的运营形式后效果改善明显,企业得到了快速发展。

在节目里其他的一些企业家也都提出了宝贵的建议:
公司的定位,不要轻易涉足其他领域;
对于陈个人的成就,不要在董事会里"个人英雄主义";
对于企业发展速度的理解等等,对于创业者都是必不可免的课程。


- 作者: johnnycui 2005年03月21日, 星期一 22:41  回复(0) |  引用(0) 加入博采

对于堆内存分配的专业说明(摘自MSDN)

Murali R. Krishnan
Microsoft Corporation

1999 年 2 月

摘要:讨论常见的堆性能问题以及如何避免这些问题。(共 9 页打印页)

介绍

您是在无忧无虑地使用动态分配的 C/C++ 对象吗?您广泛地使用自动化在模块之间相互通讯吗?您的程序可能因为堆分配而变慢吗?以上这些情况不只是您一个人遇到的。几乎所有的项目迟早都会遇到堆问 题。一般的倾向是说:"是堆慢,而我的代码确实是好代码。"这不完全正确。本文帮助您更多地了解堆、堆的用法以及可能产生的问题。


什么是堆?

(如果您已经知道什么是堆,则可以向前跳转到"常见的堆性能问题有哪些?"一节)

堆用于动态分配和释放程序所使用的对象。在以下情况中调用堆操作:

  1. 事先不知道程序所需对象的数量和大小。
  2. 对象太大,不适合使用堆栈分配器。

堆使用运行期间分配给代码和堆栈以外的部分内存。下图显示堆分配器的不同层。


GlobalAlloc/GlobalFree:直接与每个进程的默认堆通讯的 Microsoft Win32 堆调用。

LocalAlloc/LocalFree:直接与每个进程的默认堆通讯的 Win32 堆调用(用于与 Microsoft Windows NT 的兼容性)。

COM 的 IMalloc 分配器(或 CoTaskMemAlloc / CoTaskMemFree):函数使用默认的每个进程堆。自动化使用组件对象模型 (COM) 的分配器,而请求使用每进程堆。

C/C++ 运行时 (CRT) 分配器:提供 malloc()free() 以及 newdelete 运算符。编程语言如 Microsoft Visual Basic 和 Java 还提供新运算符,它们使用的是垃圾回收而不是堆。CRT 创建自己的驻留在 Win32 堆之上的专用堆。

在 Windows NT 中,Win32 堆是围绕 Windows NT 运行时分配器的一个薄层。所有的 API 都将它们的请求转发到 NTDLL。

在 Windows NT 中,Windows NT 运行时分配器提供了该核心堆分配器。它包含一个前端分配器,该分配器具有 128 个大小从 8 到 1,024 字节不等的自由列表。后端分配器使用虚拟内存保留和提交页面。

图表的底部是虚拟内存分配器,它保留和提交操作系统使用的页面。所有的分配器都使用虚拟内存设备访问数据。

分配和释放块不是很简单吗?为什么这要花费很长的时间?

有关堆实现的说明

传统上,操作系统和运行时库随附了堆实现。当进程开始时,操作系统创建称为进程堆的默认堆。如果没有使用其他堆,则使用进程堆分配块。语言运行时库也可在一个进程内创建单独的堆。(例如,C 运行时库创建自己的堆。)除这些专用堆外,应用程序或许多加载的动态链接库 (DLL) 之一也可以创建并使用单独的堆。Win32 提供了一组丰富的 API 用于创建和使用专用堆。有关堆函数的优秀教程,请参阅 MSDN 平台 SDK 节点。

当应用程序或 DLL 创建专用堆时,这些堆驻留于进程空间中并且在进程范围内是可访问的。某一给定堆分配的任何数据应为同一堆所释放。(从一个堆分配并释放给另一个堆没有意义。)

在所有虚拟内存系统中,堆位于操作系统的虚拟内存管理器之上。语言运行时堆也驻留在虚拟内存之上。某些情况下,这些堆在操作系统堆的上层,但语言运行时堆通过分配大的块来执行自己的内存管理。绕开操作系统堆来使用虚拟内存函数可使堆更好地分配和使用块。

典型的堆实现由前端分配器和后端分配器组成。前端分配器维护固定大小块的自由列表。当堆收到分配调用后,它尝试从前端列表中查找自由块。如果此操作 失败,则堆将被迫从后端(保留和提交虚拟内存)分配一个大块来满足请求。通常的实现具有每个块分配的开销,这花费了执行周期,也减少了可用存储区。

知识库文章 Q10758"Managing Memory with calloc() and malloc()"(按文章 ID 号搜索)包含有关这些主题的更多背景知识。另外,有关堆实现和设计的详细讨论,请参阅 Paul R. Wilson、Mark S. Johnstone、Michael Neely 和 David Boles 所著的"Dynamic Storage Allocation: A Survey and Critical Review"。"International Workshop on Memory Management",Kinross,Scotland,UK,1995 年 9 月 (http://www.cs.utexas.edu/users/oops/papers.html)。

Windows NT 的实现(Windows NT 4.0 版及更高版本)使用 127 个从 8 到 1,024 字节不等的 8 字节对齐块的自由列表和 1 个混合列表。混合列表(自由列表[0])包含大小超过 1,024 字节的块。自由列表包含在双向链接表中链接在一起的对象。默认情况下,进程堆执行合并操作。(合并操作是组合相邻的自由块以生成更大的块的操作。)合并操作花费了额外的周期,但减少了堆块的内部碎片。

单个全局锁可防止多线程同时使用堆。(请参阅 George Reilly 写的服务器性能和可伸缩性杀手锏的第一条戒律。)此锁主要用于保护堆数据结构不受多线程的任意访问。当堆操作过于频繁时,此锁会对性能造成负面影响。

常见的堆性能问题有哪些?

以下是在使用堆时会遇到的最常见问题:

在分配及释放操作中,争用是使速度降低的原因。理想情况下,我们希望有一个没有争用且快速分配/释放的堆。哎,这样的通用用途堆尚不存在,尽管在将来某个时候也许会出现。

在所有的服务器系统(如 IIS、MSProxy、DatabaseStacks、网络服务器、Exchange 等等)中,堆锁都是一个"大"瓶颈。处理器的数目越多,争用越厉害。

保护自己不受堆的影响

既然您知道了关于堆的一些问题,难道不想要一根解决这些问题的魔棒吗?我希望有一根魔棒。但是没有魔法使堆运行得更快,因此不要期望在发行产品的前一个星期内使速度加快。请尽早计划您的堆策略,这样会好得多。改变使用堆的方式并减少堆操作数是提高性能的可靠策略。

如何减少堆操作的使用呢?可以通过在数据结构内使用位置来减少堆操作数。考虑下面的示例:

struct ObjectA {
// data for objectA
}

struct ObjectB {
// data for objectB
}

// Use of ObjectA and ObjectB together.

//
// Use pointers
//
struct ObjectB {
struct ObjectA * pObjA;
// data for objectB
}

//
// Use embedding
//
struct ObjectB {
struct ObjectA pObjA;
// data for objectB
}

//
// Aggregation - use ObjectA and ObjectB inside another object
//

struct ObjectX {
struct ObjectA objA;
struct ObjectB objB;
}
  1. 避免使用指针来关联两个数据结构。如果使用指针关联两个数据结构,则前面示例中的对象 A 和 B 将分别被分配和释放。这是一个额外的开销,并且是我们希望避免的事情
  2. 将指向的子对象嵌入父对象中。每当对象中有指针时,就意味着有一个动态元素 (80%) 和一个要取消引用的新位置。嵌入操作增加了位置并减少了进一步分配/释放的需要。这将提高应用程序的性能。
  3. 合并较小的对象以形成较大的对象(聚合)。聚合可减少分配和释放的块数。如果有多个开发人员同时对负责设计的不同部分进行开发,最后可能得到许多可以合并的小对象。此合并的难点是要找到正确的聚合边界。
  4. 内联一个可满足 80% 需要的缓冲区(也称为 80-20 规则)。在一些情况下,需要用内存缓冲区来存储字符串/二进制数据,而总字节数事先是未知的。进行测量并内联一个大小可满足 80% 需要的缓冲区。对于余下的 20%,可以分配一个新缓冲区并用指针指向该缓冲区。这样可以减少分配和释放调用并增加数据的空间位置,这将最终提高代码的性能。
  5. 将对象分配为块区(分块)。分块是指一次将多个对象分配在一组中的方法。如果必须跟踪项列表,例如 {名称, 值} 对列表,则有两种方法:方法 1 是为每一名称-值对分配一个节点。方法 2 是分配一个可容纳例如五个名称-值对的结构。例如,如果存储四对数据是常见方案,可以减少节点数和附加链接表指针所需的额外空间量。

    分块是处理器缓存友好的,尤其是对于 L1 缓存,因为它提供了增加的位置,更不用说其中一些数据块位于用于块分配的同一虚拟页了。

  6. 适当地使用 _amblksiz。C 运行时库 (CRT) 具有自定义的前端分配器,该分配器用于从后端(Win32 堆)分配 _amblksiz 大小的块。将 _amblksiz 设置为一个较大的值可以潜在地减少对后端的调用数量。这只适用于大量使用 CRT 的程序。

通过使用上述技巧获得的节省因对象类型、大小和工作负荷而异。但总是能获得性能和可缩放性方面的好处。退一步说,代码会有点专用,但是如果认真思考,代码还是可以易于管理的。

更多性能提升


以下是一些提升速度的更多技巧:

  1. 使用 Windows NT5 堆

    由于几个人的努力和辛勤工作,在 1998 年初,Microsoft Windows 2000 进行了一些显著改进:

    • 堆代码内部的锁定改进。堆代码在每个堆上使用一个锁。此全局锁用于保护堆数据结构不由多个线程使用。不幸的是,在高通讯量的情况中,堆仍然可能陷入此全局锁中,从而导致高争用和低性能。Windows 2000 减少了锁内代码的关键区域以使争用的可能性减到最小,从而提高了缩放性。
    • 使用后备列表。堆数据结构对块大小介于 8 和 1,024 字节之间(以 8 字节递增)的所有自由项使用快速缓存。最初是在全局锁中保护快速缓存。现在使用后备列表访问快速缓存自由列表。这些列表不需要锁,并使用 64 位互锁操作,因此提高了性能。
    • 内部数据结构算法也得到改进。

    这些改进消除了分配缓存的需求,但并不排除其他优化。针对 Windows NT5 堆评估您的代码;它对于小于 1,024 字节 (1 KB) 的块(来自前端分配器的块)应该是最理想的。GlobalAlloc()LocalAlloc() 建立在同一个堆上,并且是访问每进程堆的常见机制。使用 Heap* API 可以访问每进程堆,或者在需要高度专用性能时可以创建您自己用于分配操作的堆。也可以在大块操作需要时直接使用 VirtualAlloc() / VirtualFree() 操作。

    以上描述的改进在 Windows 2000 beta 2 和 Windows NT 4.0 SP4 中得到体现。经过这些改进后,堆锁的争用率显著降低。这有利于 Win32 堆的所有直接用户。CRT 堆建立在 Win32 堆之上,却使用自己的小块堆,因此并不受益于 Windows NT 的这些改进。(Visual C++ 6.0 版也具有一个改进的堆分配器。)

  2. 使用分配缓存

    分配缓存使您得以缓存已分配的块以便将来重用。这可以减少对进程堆(或全局堆)的分配/释放调用的数量,也使得块一旦分配就得以最大程度地重用。另外,分配缓存允许您收集统计信息以便更好地理解高层上的对象使用。

    通常情况下,自定义堆分配器在进程堆之上实现。自定义堆分配器的行为与系统堆非常类似。主要差异是自定义堆分配器在进程堆之上为已分配的对象提供缓存。缓存设计用于一组固定的大小(例如,32 字节、64 字节、128 字节,等等)。这是一个好的策略,但是这种类型的自定义堆分配器不具有与已分配和已释放的对象相关的语义信息

    与自定义堆分配器相比,"分配缓存"作为每类分配缓存实现。它们除了提供自定义堆分配器的所有优点外,还可以保留许多语义信息。每个分配缓 存处理程序都与目标二进制文件中的一个对象关联。它可以由一组指示并发级别、对象大小、保留在自由列表中的元素数等的参数初始化。分配缓存处理程序对象维 护自己的已释放实体的专用池(不超过指定的阈值),并使用专用锁进行保护。分配缓存和专用锁一起减少了到主系统堆的通讯量,从而提供了增强的并发性、最大 的重用性和更高的可伸缩性。

    需要清理程序定期检查所有分配缓存处理程序的活动并回收未使用的资源。如果(当)没有发现任何活动,则可释放已分配对象池,从而提高性能。

    可以审核每一个分配/释放活动。第一级别的信息包括对象、分配和已进行的自由调用的总数。可以通过查看不同对象的统计信息,得出它们之间的语义关系。该关系可用于通过使用刚才所说的多个技巧之一减少内存分配。

    分配缓存也可作为调试辅助手段,帮助您跟踪未完全清理的对象数。除了尚未清理的对象外,甚至还可以通过查看动态堆栈反向跟踪和签名,查找确切的错误调用方。

  3. MP 堆

    MP 堆是用于多处理器友好的分布式分配的包,并可用于 Win32 SDK(Windows NT 4.0 及更高版本)。此堆最初由 JVert 实现,此处的堆抽象化建立在 Win32 堆包之上。MP 堆创建多个 Win32 堆并尝试将分配调用分布到其他堆以减少任何单个锁上的争用。

    该包是一个好的步骤,它算得上是一种改进的 MP 友好的自定义堆分配器。然而,它没有提供语义信息并缺少统计信息。使用 MP 堆的常用方式是将它用作 SDK 库。如果使用此 SDK 创建可重用组件,您将获益匪浅。而如果将此 SDK 库内置到每个 DLL 中,则将增加工作集。

  4. 重新考虑算法和数据结构

    若要在多处理器计算机上伸缩,算法、实现、数据结构和硬件必须动态伸缩。请查看最常分配和释放的数据结构。问问自己:"我可以使用不同的数据结构来 完成这项工作吗?"例如,如果有一个只读项列表在应用程序初始化时加载,则此列表不必是线性链接表。它完全可以是一个动态分配数组。动态分配数组可减少内 存中的堆块并减少碎片,从而提供性能提升。

    减少所需的小对象数可减少堆分配器上的负载。例如,我们在服务器的关键处理路径上使用了五个不同的对象,每个对象单独分配和释放。将对象一起缓存使堆调用从五个减少到一个,并显著减少了堆上的负载,尤其当每秒处理的请求多于 1,000 个时。

    如果广泛使用自动化结构,可考虑从主线代码中分离出自动化 BSTR,或者至少避免 BSTR上的重复操作。(BSTR 串联会导致过多的重新分配和分配/释放操作。)

摘要

堆实现趋于对所有平台保持通用,因此具有巨大的系统开销。每个人的代码都有特定的要求,但是设计可以适应本文所讨论的原则以减少堆交互。

  1. 评估代码中堆的使用。
  2. 提高代码的效率以使用较少的堆调用:分析关键路径并修复数据结构。
  3. 在实现自定义包装前进行度量以量化堆调用的成本。
  4. 如果对性能不满意,请询问操作系统组以改进堆。此类请求越多,意味着将投入越多的精力改进堆。
  5. 询问 C 运行时组以在操作系统提供的堆上使分配器成为瘦包装。结果,C 运行时堆调用的成本随着操作系统堆的改进而减少。
  6. 操作系统(Windows NT 家族)不断进行着堆的改进。保持步调一致并利用这些改进。

Murali Krishnan 是 Internet Information Server (IIS) 团队的首席软件设计工程师。他从 1.0 版就开始研究 IIS,并成功地将 IIS 从 1.0 版一直升级到 4.0。Murali 组织和领导了 IIS 性能小组三年 (1995-1998),并从第一天起就开始改变 IIS 的性能。他在印第安纳州的 Anna 大学获得计算机科学学士学位,并在 Wisconsin-Madison 大学获得计算机科学硕士学位。工作之余,他喜欢读书、打排球和在家烹饪。


- 作者: johnnycui 2005年03月14日, 星期一 21:42  回复(0) |  引用(0) 加入博采

女性弱点二十四式 ZT

      第一式 称呼
  女性对男性称呼由浓而淡分别是亲爱的---你---您,见面时对她说"我以后可以称呼您为你
吗?",也许她一时会感到莫名奇妙,但这却是一种可以刺激女性爱意的用语。
  
  第二式 理论
  女性在理论方面的能力普遍较弱,所以女性对于擅长数字、理化的男性会非常崇拜。在与女伴
相处时不妨偶尔谈一些理论性的话题,她很可能对你产生尊敬之感。


第三式 决断力
  女性在面对男性时决断力总是比较弱,即使是一点小事,也往往要询问一下男性的意见。也正
因为如此一位优柔寡断、婆婆妈妈的男人是很难成为女性的理想对象的。
  
  第四式 暗示
  女性对暗示的接受度很高。如果有人对她说她今天很美的话,她很可能就真的觉得自己很美。
试着对心仪的女性说"不知道是什么原因,现在突然觉得和你已不像是外人了!"
  
  第五式 方向
  女性对于方向感是较差的。带她到一个她不熟悉的地方,她一定会紧紧抓着你的外套或握着你
的手。如果女性无法一个人回家的话,一定要陪伴她安全地送她回家,这种方式比起语言的追求有
实际效果。
  
  第六式 机械
  机械能力也是一般女性较弱的一环。男士们不妨试着修理一下电话、录影机等电器用品,让她
看看你在机械方面的能力吧!
  
  第七式 婴儿
  婴儿也是女性的弱点之一。女性较易对喜欢小孩的男性产生好感,如果迎面来了一位抱着婴儿
的妇人,此时你去逗弄那婴儿,相信你的女伴必会感受到这份温馨,对你愈来愈有好感。
  
  第八式 白、圆、亮
  女性对于"白、圆、亮"的事物特别有好感。选择在月夜下漫步或花朵盛开的地方约会,都是
不错的选择。
  
  第九式 秘密
  秘密是女性的弱点。女性只会对非常亲密的朋友说出秘密。在她对你所说秘密时,已经将彼此
定位在相同意识之中了。别轻忽了此种弱点的运用,如果能运用在追求的方式上,效果非凡。
  
  第十式 音乐
  音乐也算是一弱点。爵士音乐较会使女人产生兴奋感,与其带她去看电影,不如带她去听演唱
会或音乐会。尤其是年纪较轻的女性,这种倾向更是明显。
  
  第十一式 同情
  女性极易对事物产生同情心,也正因为如此,即使对于没有好感的男性也会有同情心。试着在
雨天故意不带雨伞等着心仪的女性,相信会有一定程度的进展。
  
  第十二式 具有魔力的字眼
  "结婚"就是一个最有魅力的字眼。但是千万不可用"结婚"来欺骗女人感情,此种手段就太
卑劣了。要使用此弱点的前提是"真有结婚的打算",若真有此打算一定要早日表明清楚,因为男
人最失败的一点就是迟来的情感表白。第十三式知性的对谈"赞美女性的容貌倒不如赞美她的知
性",单单只有容貌上的赞美并不能令所有的女性感到欢喜。你可以对她赞美"像今天和你这样知
性的聊天,这辈子是第一次。"
  
  第十四式 玫瑰花束与钻石
  这是针对女性虚荣心衍生出来的弱点。送花最好是玫瑰或卡特兰,送珠宝最好是钻石;当然如
果经济状况许可的话。
  
  第十五式 色彩
  观察女性喜欢的色彩有助于做进一步的了解。积极的女性比较喜欢白、红和金色。偏好褐色系
的女性在个性上比较慎重。喜欢黄色系的女性具有比较大胆的个性;偏好蓝色的女性则比较难缠,
个性比较不定;和比自己年长的女性交往的话,尽量选择喜好紫色的女士;喜欢黑色的女性则较易
接受性方面的要求。
  
  第十六式 季节性
  女性对季节的反应比男性来的早。追求女性时切记"以服装为对象是个高明的追求法。"
  
  第十七式 发型
  发型是女性的一项弱点。女人的发型受到赞美,这个女人一定会很高兴。对于发型多加赞美是
会得到很好的效果的。
  
  第十八式 算命
  这可称得上是最大的弱点。好好利用此弱点,看手相或面相是最好的;因为可以藉算命的时候
碰触到对方的手或脸,好好发挥吧!
  
  第十九式 抚触
  这里所说的抚触是指碰碰手、碰碰肩。我们可以发现较会逢场作戏的男人似乎较能令女人折
服,其中道理就是如此。
  
  第二十式 柔软的感觉
  这是针对女性心理情感上的弱点。女性大多喜欢有曲线设计的建筑物。对人亦是如此,女性对
于让人感到脾气柔软的男人较有好感。
  
  第二十一式 横式文字
  横式文字是女性的弱点。各种流行的女性杂志都是采用横式的编排方式。可以采用一些横式的
文字与女性交往,别忘了----英文就是一种标准的横式文字。
  
  第二十二式 纯白的衬衫
  男性的清洁是女性所注意的。请准备纯白衬衫,清爽洁净的发型及有品味的服装,否则一切的
追求都免谈了。
  
  第二十三式 电话的声音
  女性的耳朵对于低音会产生很大又很快的反应,即使在白天双方有磨擦,试着在晚上拨通电话
给她,也许一切都会有转机。切记!说话太大声的男人通常不会是女所欣赏的类型。
  
  第二十四式 附加
  约会结束后都会道别,但是如果再一次握她的手,也许原本只是朋友的那种感情,在这一次握
手后,会突然有"情侣"的感觉。写信给女性时在信尾附加一句"我爱你",并且重复写两次,这
种行动必定会令女性为之心动的。

- 作者: johnnycui 2005年03月11日, 星期五 09:38  回复(6) |  引用(0) 加入博采